javascript - 反模式聚合错误并传递给 promise 解析 js?

标签 javascript es6-promise

我在一个异步运行的循环中处理一个列表,返回一个 promise ,我不想在异常时退出处理,所以我聚合它们并将它们传递给外部 finally block 中的解析回调。 我想知道这是否是反模式,如果是,请提供有关如何正确执行的指示。 谢谢。

例子

async doSomething(list) {
let errorCount = 0
let errors = []
return new Promise(async (resolve, reject) => {
  try {
    list.forEach(async (item) => {
      try {
        actionThatThrows(item)
      } catch (e) {
        errorCount++
        errors[errorCount] = e
      }
    })
  } catch (e) {
    errorCount++
    errors[errorCount] = e
  } finally {
    if (errorCount > 0) {
      resolve(errors)
    } else {
      resolve()
    }
  }
})

最佳答案

是的,这段代码使用了几个反模式:

I do not want to exit processing on exception but aggregate them

为此你可能想看看 Wait until all ES6 promises complete, even rejected promises

但是你也可以在没有这些的情况下做到这一点,假设你想要顺序迭代:

async function doSomething(list) {
    const errors = [];
    for (let item of list) {
        try {
            await actionThatThrows(item);
        } catch (e) {
            errors.push(e);
        }
    }
    if (errors.length)
        return errors;
    else
        return …;
}

关于javascript - 反模式聚合错误并传递给 promise 解析 js?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41257319/

相关文章:

javascript - 其他字段条件下的 jQuery 最大值输入字段

javascript - Promise 解析时 JSON 输入意外结束

javascript - 在 promise 中循环数组并将其作为参数传递给下一个 promise 后,如何在链接时返回一个值?

javascript - 尽管使用 ECMAScript 6, typescript 找不到名称 'Promise'

javascript - 如何导出 promise 结果?

javascript - Excel-JS - 重新计算不起作用

javascript - 传单上下文菜单无法正常工作或无法响应事件

javascript - es6 promise swallow 类型错误

javascript - 运行 gulp 后如何在浏览器选项卡中打开站点?

javascript - 使用 Restangular 在 Angular 中协调多个 AJAX 调用