Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在parallel中执行什么(显式和隐式),在node.js中按顺序执行什么?_Node.js_Event Handling_Parallel Processing_Promise - Fatal编程技术网

在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”调用相应的回调函数

参考: