如何避免由于错误而导致的承诺循环中断

时间:2018-12-19 00:40:58

标签: node.js promise

我刚开始在节点应用程序中使用Promise。而且我相信,如果其中一个返回错误,则循环下面的代码将中断,并被拒绝。

有没有办法让循环结束,跳过有错误的循环。而且我仍然希望循环结束时有所有错误通知。

另一个问题:是否有更好的方法来使用resolve而不是使用count++; if(count===items.length) resolve(items)

get_customer_purchase = (items) => {
  return new Promise((resolve, reject)=>{
    let count = 0;
    for (let i in items) {
      get_options(items[i].id).then((options)=>{
        //do some process
         count++; if(count===items.length) resolve (items)
      }).catch((error)=>reject(error))
    }    
  })
}

1 个答案:

答案 0 :(得分:0)

您可以这样写:

get_customer_purchase = (items) => {
  const promiseArray = items.map((item) => {
    return get_options(item.id)
  })

  return Promise.all(promiseArray)
    .then((optionsResult) => items)
}

请注意,如果一个get_options将失败,您将收到一次失败:

get_customer_purchase(array)
  .then(items => /** do stuff */ )
  .catch(error => /** one get_options fail */ )

如果您想忽略某些get_options的错误,可以简单地进行更改:

return get_options(item.id).catch(err => {return null})

,然后在.filter中使用optionsResult函数:

.then((optionsResult) => optionsResult.filter(_ => _!==null))