Promise.join
接受一堆 promise 作为参数,并将最后一个参数视作函数。
Promise.join(Promise.delay(100), request("http://...com"), function(_, res){
});
您正在向它提供两个函数,以便执行以下操作:
- 在
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){
});
这个方法能够正常工作是因为请求发生在延迟返回之前,因为该函数在同一范围内被调用。
.join()
有什么功能是.all()
不能实现的吗?还是只是不同的语法形式? - jfriend00Promise.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