蓝鸟承诺(Bluebird Promises)的连接行为

11

如果我在Node.js中执行以下代码:

var Promise = require('bluebird');

Promise.join(
    function A() { console.log("A"); },
    function B() { console.log("B"); }
).done(
    function done() { console.log("done");}
);

控制台将记录日志

B
done

然而我希望

A
B
done
或者
B
A
done
如果在函数A中设置断点,则永远不会到达。为什么它会处理B但不是A?

如果在函数A中设置断点,为什么它可以处理B却无法到达A?

1个回答

16

Promise.join 接受一堆 promise 作为参数,并将最后一个参数视作函数。

Promise.join(Promise.delay(100), request("http://...com"), function(_, res){
       // 100 ms have passed and the request has returned.
});
您正在向它提供两个函数,以便执行以下操作:

  • function A() { ... }上创建一个promise - 基本上是返回一个promise
  • 当它完成(立即)时,执行最后一个参数,function B() {... }并记录它。

请参见文档:

Promise.join(Promise|Thenable|value promises..., Function handler) -> Promise

用于协调多个并发离散promises。虽然.all()适用于处理动态大小的统一promise列表,但是当您有一定量的离散promise需要同时协调时,使用Promise.join更加容易(且性能更高),例如:

var Promise = require("bluebird");

var join = Promise.join;

join(getPictures(), getComments(), getTweets(),

     function(pictures, comments, tweets) {

     console.log("in total: " + pictures.length + comments.length + tweets.length);

});


更新:

JSRishe提出了另一种聪明的解决此类模式的方法在这个答案中,大致如下:

Promise.delay(100).return(request("http://...com").then(function(res){
    // 100 ms have passed and the request has returned 
});

这个方法能够正常工作是因为请求发生在延迟返回之前,因为该函数在同一范围内被调用。


1
.join()有什么功能是.all()不能实现的吗?还是只是不同的语法形式? - jfriend00
5
Promise.join(p1, p2,..., pn, fn) 类似于 Promise.all([p1, p2, ..., pn]).spread(fn),但速度略快。这对于一个固定数量的 Promise 很有用,并且对于使用 Promise 作为代理的情况也很实用:var p1 = asyncOp(); var p2 = p1.then(otherOp); var p3 = p2.then(oneMore); Promise.join(p1, p2, p3, function(r1, r2, r3){ ...。它的另一个优点是在像 TypeScript 这样的语言中具有更好的类型信息,因为更容易进行静态分析。 - Benjamin Gruenbaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接