理解Promise.all

时间:2016-01-12 11:58:28

标签: javascript es6-promise

考虑我从https://stackoverflow.com/a/28250704/460084

获取的以下代码
function getExample() {
    var a = promiseA(…);
    var b = a.then(function(resultA) {
        // some processing
        return promiseB(…);
    });
    return Promise.all([a, b]).spread(function(resultA, resultB) {
        // more processing
        return // something using both resultA and resultB
    });
}

以及我创建的代码https://jsfiddle.net/Lsobypup/

的演示

这个想法是运行多个promise并根据结果返回一些复合值。

我不明白为什么在上面的代码中promiseA只运行一次?在我看来,使用Promise.all([a,b])它应该在a被评估时首先运行,然后在b被评估时再次运行,因为它依赖于a。但是,正如演示所示,这不会发生。

Promise.all中是否有一些魔法能够实现这一目标?这种行为有哪些规则?

2 个答案:

答案 0 :(得分:1)

var b = a.then(function(resultA) {
        // some processing
        return promiseB(…);
    });

这是a的结果链接,这意味着如果a处于已满足状态,则会立即调用回调。您的承诺a的解决方案首先发生,因为它在all()电话中首先遇到。 一旦实现,最终价值始终坚持承诺。

根据MDN reference

  

在内部,承诺可以处于以下三种状态之一:

     
      
  • 待定,当最终值尚不可用时。这是唯一可能转变为其他两个州之一的州。
  •   
  • 完成,当最终值可用时。履行价值与承诺永久相关。   这可以是任何值,包括undefined。
  •   
  • 如果错误阻止确定最终值,则拒绝。拒绝理由与永久相关   承诺。这可能是任何值,包括undefined,尽管它是   通常是一个Error对象,就像异常处理一样。
  •   

答案 1 :(得分:0)

使用bluebird模块会非常棒 http://bluebirdjs.com/docs/api/promise.props.html

const Promise = require("bluebird");
Promise.props({
    pictures: getPictures(),
    comments: getComments(),
    tweets: getTweets()
})
.then(function(result) {
    console.log(result.tweets, result.pictures, result.comments);
});