Node.js での非ブロッキング関数の正しい実装
誤解にもかかわらず、コードを Promise でラップするだけでは、非ブロック関数にはなりません。 -ブロッキング。 Promise executor 関数は本質的に同期的であるため、実行をブロックします。これが、後続の行を印刷する前に提供されたコードで観察される遅延の理由です。
提供されたコードの問題
コードは最初はノンブロッキングであるように見えます、Promise を利用して、計算量の多いlongRunningFunc の結果を返します。ただし、実行すると、2 行目と 3 行目が出力されるまでに遅延が観察されます。これは、プログラムが Promise の解決を待っていることを示しています。
Node.js の真のノンブロッキング コード
Node.js で真にノンブロッキング コードを作成するには、いくつかの方法があります。オプション:
例の修正
コードを Promise でラップするだけでは非ブロック動作には十分ではありませんが、setTimeout() を使用してスケジュールを設定できます。後で実行するための for ループ:
function longRunningFunc(val, mod) { return new Promise((resolve, reject) => { setTimeout(() => { let sum = 0; for (let i = 0; i < 100000; i++) { for (let j = 0; j < val; j++) { sum += i + j % mod; } } resolve(sum); }, 10); }); }
このアプローチでは、for ループのタイミングがシフトされます。非ブロッキング動作のように見えます。ただし、for ループはスケジュールされた後も同期的に実行されることに注意することが重要です。真のノンブロッキング コードを実現するには、前に説明した手法のいずれかを採用する必要があります。
以上がNode.js でノンブロッキング関数を正しく実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。