此示例混淆了我对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)
在queue
中推送的所有1.
元素的保证在哪里?可能是这样,来自numbers
的{{1}}是如此之大,以至于它与1.
并行吗?
这些想法来自于node.js将首先使用2.
处理1.
和2.
,然后将其提供给node.js event-loop
,这实际上类似于普通线程。
所以问题 - 将workers
和1.
相互并行执行,从2.
开始顺序执行,或者按顺序执行(node.js event-loop
推送所有元素在队列中,只有在1.
开始处理2.
中的每个元素之后?
请提供有关此主题文档的一些直接链接的参数。
答案 0 :(得分:1)
在最顶层,1和2的Q.all(queue).then(...).fail(...).fin(...);
方法链将明确地按顺序执行。
在1和2中定义/调用的函数的精确执行时间在很大程度上取决于slowFunction
的性质。
如果slowFunction
完全由同步javascript执行(例如,一些广泛的数学),那么1将在2开始之前完整地完成。在这种情况下,2中指定的回调将在2的方法链完成执行后很快执行,因为slowfunction
返回的任何承诺将(或者至少应该)已经解决。
但是,如果slowFunction
涉及一个或多个异步节点I / O进程(例如文件处理或资源提取),则每次调用它将(至少部分)由一个非阻塞工作线程(不是javascript);在这种情况下,正确写入slowFunction
,queue
将累积一组承诺,每个承诺将在以后解决或拒绝。 2中指定的回调将在2的方法链完成执行后执行,并且所有承诺都已被解决或拒绝。
对我来说,2的介绍性文本的重新版本将大大有助于解释执行的顺序:
Q.all:等待
queue
数组中的每个“承诺” 已解决或拒绝'然后'调用相应的回调函数。
参考:http://rickgaribay.net/archive/2012/01/28/node-is-not-single-threaded.aspx