如何在promise链中返回promise.map(bluebird)?

时间:2016-11-24 20:32:17

标签: javascript node.js asynchronous promise bluebird

我正在使用一个链来控制流量,并且无法在step2()中获取promise.map以等待所有生成的promise都被解析。

这是我想要实现的流程的视觉效果。

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之外,它按预期工作。我究竟做错了什么? :)

2 个答案:

答案 0 :(得分:3)

问题来自第2步。Promise.map已经返回promise,所以你可以将它返回给被调用者。然后使用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);
      });
    });
  });
}

答案 1 :(得分:0)

您没有正确调用let step2 = function() { things = [] return Promise.map(things, function(thing) { return new Promise( function( resolve, reject ) { // load file async with callback resolve(...) } ) }) } 回调。

resolve()

在你的情况下,总是调用jq -r '.[] | select(.hosts | contains('$array')).hostName') ,因为你正在执行异步函数来加载文件。