蓝鸟承诺join行为
如果我用Node.js执行下面的代码
var Promise = require('bluebird'); Promise.join( function A() { console.log("A"); }, function B() { console.log("B"); } ).done( function done() { console.log("done");} );
控制台将会logging
B done
不过,我期望
A B done
要么
B A done
如果它在函数A中设置了一个断点,它永远不会到达。 为什么它处理B而不是A?
Promise.join
承诺作为所有的论点,但最后一个,这是一个function。
Promise.join(Promise.delay(100), request("http://...com"), function(_, res){ // 100 ms have passed and the request has returned. });
你喂它有两个function,所以它会做到以下几点:
- 通过
function A() { ... }
作出承诺 – 基本上是对它作出承诺 - 当它完成(立即)执行最后一个参数,
function B() {... }
logging它。
看文档:
Promise.join(Promise|Thenable|value promises..., Function handler) -> Promise
协调多个同时离散的承诺。 虽然.all()适合处理dynamic大小的统一承诺列表,但是当您想要同时协调一定数量的离散承诺时,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 });
这是有效的,因为在延迟返回之前请求已经发生,因为函数在相同的范围内被调用。