蓝鸟承诺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 }); 

这是有效的,因为在延迟返回之前请求已经发生,因为函数在相同的范围内被调用。