这个例子混淆了我对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.并行不悖,这是不是真的?这些想法来自于这样一种理解,即node.js将首先使用node.js event-loop处理1.和2.,然后将其提供给workers,这实际上类似于普通线程。
那么问题是:1.和2.是并行执行,还是从node.js event-loop开始顺序执行( 1.会推入队列中的所有元素,只有在这之后2.才开始处理queue中的每个元素)?请提供参数,并提供一些指向此主题文档的直接链接。
发布于 2012-12-23 08:02:54
在最顶层,1.和2的Q.all(queue).then(...).fail(...).fin(...);方法链将明确地按顺序执行。
在1和2中定义/调用的函数的精确执行时间在很大程度上取决于slowFunction的性质。
slowFunction完全由同步javascript执行(例如,一些扩展数学),那么1将在2开始之前完成它的全部。在这种情况下,在2中指定的回调将在2的方法链完成执行后不久执行,因为由slowfunction返回的任何promises都将(或至少应该)已经被解析。slowFunction涉及一个或多个异步节点I/O进程(例如.文件处理或资源获取),那么对它的每个调用都将(至少部分地)由一个非阻塞工作线程(不是javascript)承担;在这种情况下,如果slowFunction被正确编写,queue将累积一组promises,每个promises稍后将被解析或拒绝。在2中指定的回调将在2的方法链完成执行以及所有承诺都已解决或被拒绝时执行。对我来说,2的介绍文本的重新表述版本将在很长一段时间内解释执行顺序:
promise:等待的
queue数组中的每个“promise”都被解析或拒绝“then”调用相应的回调函数。
参考:http://rickgaribay.net/archive/2012/01/28/node-is-not-single-threaded.aspx
https://stackoverflow.com/questions/13529903
复制相似问题