在parallel中执行什么(显式和隐式),在node.js中按顺序执行什么?
这个例子混淆了我对在parallel中执行什么(显式和隐式),在node.js中按顺序执行什么?,node.js,event-handling,parallel-processing,promise,Node.js,Event Handling,Parallel Processing,Promise,这个例子混淆了我对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 callb
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.
的数字太大了,以至于它与2.
并行工作?
这些想法来源于这样一种理解,即node.js将首先使用node.js事件循环处理1.
和2.
,然后将其交给workers
,这实际上与普通线程类似
因此,问题-将是1.
和2.
彼此并行执行,从node.js事件循环开始
按顺序执行,还是按顺序执行(将1.
推送队列中的所有元素,只有在这之后,2.
才开始处理队列中的每个元素
)?
请提供一些直接链接到此主题文档的参数。在最顶层,1。然后(…).fail(…).fin(…)代码>方法链,将明确地按顺序执行
在1和2中定义/调用的函数的精确执行时间在很大程度上取决于slowFunction
的性质
- 如果
slowFunction
完全由同步javascript执行(例如,一些扩展的数学),那么1将在2开始之前全部完成。在这种情况下,2中指定的回调将在2的方法链完成执行后很快执行,因为slowfunction
返回的任何承诺都将(或至少应该)得到解决
- 但是,如果
slowFunction
涉及一个或多个异步节点I/O进程(例如,文件处理或资源获取),则对它的每次调用(至少部分)将由非阻塞工作线程(非javascript)执行;在这种情况下,如果正确编写了slowFunction
,queue
将累积一组承诺,每个承诺都将在以后得到解决或拒绝。在2中指定的回调将在2的方法链完成执行后以及所有承诺都已解决或被拒绝时执行
对我来说,对2的介绍性文本进行重新措辞将大大有助于解释执行顺序:
Q.all:等待的队列中的每个“承诺”都是
已解析或拒绝“then”调用相应的回调函数
参考: