从递归函数catch中解析promise

时间:2017-04-13 09:31:01

标签: javascript recursion promise es6-promise

我有一个函数在捕获错误时以不同的输入递归调用自身:

function getSomething(inputs, index) {

  var index = index || 0
    , indexMax = inputs.length - 1

  return new Promise((resolve, reject) => {
    //inputs[index].staff is an array and getSomethingElse returns a Promise
    Promise.all(inputs[index].staff.map(getSomethingElse))
    .then(output => {
      resolve(output)
    })
    .catch(reason => {
      if(index<indexMax)
        getSomething(inputs, index+1);
      else
        reject(reason);
    })
  })
}

getSomething(myInputs)
.then(output => {
  console.log('resolved with this:'+output);
})
.catch(reason => {
  console.log('rejected because of this:'+reason);
});

我得到UnhandledPromiseRejectionWarning:来自getSomethingElse拒绝的未处理承诺拒绝错误。我认为这种拒绝并没有像它预期的那样在第一个函数调用中被捕获。如何调用第一个函数调用的拒绝?或者我应该在每个函数调用中将第一个承诺作为参数?

2 个答案:

答案 0 :(得分:2)

这是promise constructor anti-pattern。构造函数用于包装旧版API

相反,总是returning all of them将这些承诺链接起来。

function getSomething(inputs, index = 0) {
  return Promise.all(inputs[index].staff.map(getSomethingElse))
    .catch(reason => {
      if (index >= inputs.length - 1) throw reason;
      return getSomething(inputs, index+1);
    })
  })
}

答案 1 :(得分:0)

我刚刚找到了解决方案。实际上,我应该已经定义了解决方案并拒绝了返回的promise,以便传输到前一个:

 if(index<indexMax) {
   getSomething(inputs, index+1)
   .then(output => {
     resolve(output);
   })
   .catch(reason => {
      reject(reason);
   })
}
 else
   reject(reason);