如何在承诺链中 return promise.map (bluebird)?

How to return promise.map (bluebird) inside a promise chain?

我正在使用链来控制流程,无法在 step2() 中获取 promise.map 以等待其所有生成的承诺都得到解决。

这是我试图实现的流程的视觉效果。

step1() step2() step2() step2() step2() step3()

step2() 中,我使用的是 Bluebird 的 promise.map。

链条如下:

step1()
  .then(function() { return step2() }) 
  .then(function() { return step3() })
  .catch(function() { // handle errors })

这是我的每一步函数:

let step1 = function() {
  return new Promise(function(resolve, reject) {      
    // do stuff
    resolve()
  })
}

let step2 = function() {
  return new Promise(function(resolve, reject) {
    things = []      
    return Promise.map(things, function(thing) {
      // load file async with callback
    })
    resolve()
  })
}

let step3 = function() {
  return new Promise(function(resolve, reject) {      
    // do stuff
    resolve()
  })
}

我用更多步骤测试了链,每个步骤都带有 timeout,它按预期工作,但 step2() 中的 promise.map 除外。我究竟做错了什么? :)

您没有正确调用 resolve 回调。

let step2 = function() {
    things = []      
    return Promise.map(things, function(thing) {         
      return new Promise( function( resolve, reject ) {
          // load file async with callback
          resolve(...)
      } )
    })
}

在你的情况下,总是调用 resolve(),因为你正在执行加载文件的异步函数。

问题来自第 2 步。Promise.map 已经 return 承诺,因此您可以 return 将其发送给被叫方。然后你用 new Promise.

扭曲带有回调的异步函数
let step2 = function() {
  things = []      
  return Promise.map(things, function(thing) {
    // load file async with callback
    return new Promise(function(resolve, reject) {
      fileAsyncFunc(thing, function callback(err, data) {
        if(err) {
          reject(err);
          return;
        }
        resolve(data);
      });
    });
  });
}