2

この例は、どのように機能するかについての私の理解を混乱させますnode.js

// 1.
numbers.forEach(function(number) {
  queue.push(Q.call(slowFunction, this, number));
});

// 2.
// Q.all: execute an array of 'promises' and 'then' call either a resolve 
// callback (fulfilled promises) or reject callback (rejected promises)
Q.all(queue).then(function(ful) {

  // All the results from Q.all are on the argument as an array
  console.log('fulfilled', ful);
}, function(rej) {

  // The first rejected (error thrown) will be here only
  console.log('rejected', rej);
}).fail(function(err) {

  // If something went wrong, then we catch it here, usually when there is no
  // rejected callback.
  console.log('fail', err);
}).fin(function() {

  // Finally statement; executed no matter of the above results
  console.log('finally');
});

ここで、コードの一部が順番に実行される1.と想定されるのはなぜですか?では、プッシュされたすべての要素2.で機能する保証はどこにありますか?それは、fromが非常に大きく、並列よりも機能するということでしょうか?これらのアイデアは、node.jsが最初にを処理し、次にそれをに与えるという理解から生まれました。これは実際には通常のスレッドに類似しています。Q.all(queue)queue1.numbers1.2.1.2.node.js event-loopworkers

したがって、質問は、互いに並行して実行され、1.順番に実行されますか、それとも順番に実行されますか(キュー内のすべての要素をプッシュし、その後でのみ、の各要素の処理を開始します)?このトピックのドキュメントへの直接リンクを引数に指定してください。2.node.js event-loop1.2.queue

4

1 に答える 1

1

最上位レベルでは、1と2のQ.all(queue).then(...).fail(...).fin(...);メソッドチェーンが明確に順番に実行されます。

1と2内で定義/呼び出された関数の実行の正確なタイミングは、の性質に大きく依存しslowFunctionます。

  • 同期JavaScript(たとえば、いくつかの広範な数学)によって完全に実行される場合slowFunction、2が開始する前に1が完全に完了します。この場合、2で指定されたコールバックは、2のメソッドチェーンの実行が終了した直後に実行されます。これは、によって返されるpromiseslowfunctionがすでに解決されている(または少なくとも解決されている必要がある)ためです。

  • ただし、slowFunction1つ以上の非同期ノードI / Oプロセス(ファイル処理やリソースフェッチなど)が含まれる場合、そのプロセスへの各呼び出しは、(少なくとも部分的に)非ブロッキングワーカースレッド(javascriptではない)によって実行されます。この場合、提供slowFunctionは正しく書かれ、queue一連の約束が蓄積され、それぞれが後で解決または拒否されます。2で指定されたコールバックは、2のメソッドチェーンの実行が終了した後、およびすべてのPromiseが解決または拒否されたときに実行されます。

私にとって、2の紹介テキストの言い換えバージョンは、実行の順序を説明するのに大いに役立ちます。

Q.all:queue配列内のすべての「promise」が解決または拒否されるのを待ってから、対応するコールバック関数を呼び出します。

参照: http: //rickgaribay.net/archive/2012/01/28/node-is-not-single-threaded.aspx

于 2012-12-23T00:02:53.737 に答える