2

这个例子混淆了我对工作原理的理解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.的保证在哪里?是不是这样,from是如此之大,以至于它的工作原理比平行于?这些想法来自对 node.js 将处理的理解,首先是使用然后将其交给,这实际上类似于普通线程。Q.all(queue)queue1.numbers1.2.1.2.node.js event-loopworkers

所以问题 - 将彼此1.并行2.执行,从node.js event-loop顺序开始还是按顺序执行(1.推送队列中的所有元素,然后才2.开始处理中的每个元素queue)?请提供一些指向该主题文档的直接链接的论点。

4

1 回答 1

1

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

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

  • 如果slowFunction完全由同步 javascript 执行(例如一些广泛的数学),那么 1 将在 2 开始之前完全完成。在这种情况下,2 中指定的回调将在 2 的方法链完成执行后不久执行,因为任何返回的承诺slowfunction都将(或至少应该)已经解决。

  • 然而,如果slowFunction涉及一个或多个异步节点 I/O 进程(例如文件处理或资源获取),那么对它的每次调用将(至少部分)由非阻塞工作线程(不是 javascript)进行;在这种情况下,slowFunctionproviding 写得正确,queue会积累一组 Promise,每一个 Promise 都会在后面被解决或拒绝。2 中指定的回调将在 2 的方法链执行完毕并且所有的 Promise 都已解决或拒绝后执行。

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

Q.all:等待queue数组中的每个“承诺”被解析或拒绝,“然后”调用相应的回调函数。

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

于 2012-12-23T00:02:53.737 回答