Promise.All中长期承诺链的最佳实践是什么

时间:2016-10-11 17:09:17

标签: javascript node.js promise bluebird es6-promise

假设我有几个主要的承诺,其中一些承诺在内部。我想从一系列promise函数中检索结果,这就是为什么我会考虑Promise.all。首先,让我们看看下面的示例代码

var Promise = require('bluebird');
promise = []
function promise1(){
  return new Promise(function(resolve, reject){
    console.log('promise1');
    resolve('promise1');
  });
}
function promise2(){
  return new Promise(function(resolve, reject) {
    console.log('promise2');
    resolve('promise2');
  });
}
function promise3(){
  promise2().then(function(){
    return new Promise(function(resolve, reject) {
      console.log('promise3');
      resolve('promise3')
    })
  })
}

上面的代码,2个主要承诺是promise1promise3promise2将返回promise3。我正在证明promise3是一个长期的承诺。要运行,我初始化

promise = [promise1(), promise3()];
Promise.all(promise).then(function(data){
  console.log('done', data);
})

结果是

  

promise1

     

promise2

     

promise3

     

完成['promise1',undefined]

但我期待

  

完成['promise1','promise3']

我的问题是这种情况下的最佳做法是什么?

1 个答案:

答案 0 :(得分:4)

promise3缺少return。有了它,它按预期工作。

function promise3(){
  return promise2().then(function(){
  // ^^^ missing return here
    return new Promise(function(resolve, reject) {
      console.log('promise3');
      resolve('promise3')
    })
  })
}

更新

如果你简化你的案例,你就是这样做的:

var a = new Promise(function(resolve) {
  resolve("a");
});
var b = a.then(function () {
  return new Promise(function(resolve) {
    resolve("b");
  }));
});

然后你的问题是:“为什么a的已解决价值不等于b?”。嗯,他们是两个不同的承诺。

使用return a,您将返回原始promise2。在a.then中,您最终会返回promise3