是否可以链接.all()而不是使用Promise.all()?

时间:2016-08-01 20:38:31

标签: javascript node.js promise

我正在使用蓝鸟承诺在Node.js工作。我想在我的承诺链中使用Promise.all,并尝试了这个:

request-promise(some_API_call)
.then( (responseBody) => {
      
      // using responseBody to determine N new API calls to make
  
      var arrayPromises = [];
  
      for (var i=0 ; i<N ; i++) {
            var newPromise = request-promise(new_API_call_i);
            arrayPromises.push(newPromise);
      } 
  
      return(arrayPromises);
 
})
.all(arrayPromises)
.then( (arrayResults) => {
    // do something
});

给我一​​个错误:arrayPromises is undefined

我能想到的另一种方式是:

request-promise(some_API_call)
.then( (responseBody) => {
      
      // using responseBody to determine N new API calls to make
  
      var arrayPromises = [];
  
      for (var i=0 ; i<N ; i++) {
            var newPromise = request-promise(new_API_call_i);
            arrayPromises.push(newPromise);
      } 

      Promise.all(arrayPromises)
      .then( (arrayResults) => {
          // do something
      });
})

我想知道是否:

  • 这些模式中的任何一种都是正确的吗?
  • 我不是一次又一次地在另一种反模式中堕落:在这种背景下嵌套承诺链是否正确?

1 个答案:

答案 0 :(得分:2)

arrayPromises未定义,因为它是在以下then无法访问的回调范围内定义的。我想您希望从最初的Promise.all返回then并从那里继续链接:

request-promise(some_API_call)
.then( (responseBody) => {

      // using responseBody to determine N new API calls to make

      var arrayPromises = [];

      for (var i=0 ; i<N ; i++) {
            var newPromise = request-promise(new_API_call_i);
            arrayPromises.push(newPromise);
      } 

      return Promise.all(arrayPromises);

})
.then( (arrayResults) => {
    // do something
});