什么是执行(显式和隐式)并行和在node.js中按顺序?

这个例子混淆了我对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.部分代码将被顺序执行? 那么, Q.all(queue)在所有推入1. queue元素上工作的保证在哪里? 可能是这样的,从1.numbers是如此之大,以至于与2.相当2. 这些想法来自于以下理解:node.js将首先用node.js event-loop处理1.2.然后将其赋予给workers ,这实际上与普通线程类似。

所以这个问题将会是1.2.彼此并行执行,从node.js event-loop顺序执行或者它们将被顺序地执行( 1.将队列中的所有元素都压入,然后才开始2.开始处理queue每个元素)? 请提供一些直接链接到该主题文档的参数。

在最顶层,1.和2的Q.all(queue).then(...).fail(...).fin(...); 方法链,将毫不含糊地按顺序执行。

在1和2中定义/调用的函数的执行的确切时间很大程度上取决于slowFunction的性质。

  • 如果slowFunction完全由同步JavaScript(例如一些广泛的Math)执行,那么1将在2次启动之前完全完成。 在这种情况下,2中指定的callback将在2的方法链完成执行后很快执行,因为由slowfunction返回的任何slowfunction都将(或者至less应该)已经解决。

  • 然而,如果slowFunction包含一个或多个asynchronous节点I / O进程(例如,文件处理或资源获取),则每个对它的调用将至less部分由非阻塞工作线程(非JavaScript)执行。 在这种情况下,提供slowFunction是正确的写入, queue将积累一组承诺,其中每一个将被解决或稍后被拒绝。 2中指定的callback将在2的方法链执行完毕后执行,当所有的promise都被解决或拒绝时。

对我来说,2的介绍性文字的改写版本对解释执行的顺序将有很大的帮助:

Q.all:等待queue数组中的每个'promise'被parsing或拒绝,然后调用相应的callback函数。

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