【问题标题】:Promise.all error-handling syntax when async func is passed as argument异步函数作为参数传递时的 Promise.all 错误处理语法
【发布时间】:2020-09-04 23:15:33
【问题描述】:

查看以前的答案,在 Promise.all 中处理错误的适当方法是使用以下内容:

  Promise.all(
    promises.map(p => p.catch(error => null))
  )

在我的代码中,我想在 Promise 的映射中传递一个异步函数,并且能够在该 Promise 失败时运行 catch,而不会杀死整个链。

我的代码:

const handler = async (item) => {
   const result = await Promise()
   return result
}

const items = [1,2,3]

const results = await Promise.all(items.map(handler))

如何在 Promise.all 中运行处理程序 func 的同时仍能捕获错误并保持链处于活动状态?

【问题讨论】:

  • 等等,我是在绊倒,还是你在尝试处理对 Promise.all() 内的任何 Promise 的拒绝?因为一旦任何 Promise 失败,Promise.all() 就会完全拒绝。
  • 如果我弄错了,@RoboRobok 纠正我,但我相信已经进行了一些增强以支持 Promise.all 中的错误捕获以保留活动链。 stackoverflow.com/questions/43503872/…
  • Promise.allSettled() 的形式有所改进。旧的Promise.all() 会拒绝它内部的任何东西,甚至不关心未完成的承诺。
  • 它可以工作,因为这些 Promise 里面永远不会拒绝。 then() 将拒绝静音。这是在这些 Promise 进入 Promise.all() 之前完成的。
  • 我的意思是你的 catch(),它是 then(undefined, calback) 的别名。 Promise 从不具有同步性质。当你把一个带有多个 then() 和 catch() 的 Promise 放到 Promise.all() 中时,每条链的末端就是最终的 Promise。但它们仍然异步工作。 Promise.all() 唯一的事情是它知道它们何时全部解决或其中任何一个被拒绝(即不捕获)。

标签: javascript node.js


【解决方案1】:

.map 编写另一个函数来执行您在第一个代码块中所做的相同操作:调用handler.catch 如果它抛出:

const results = await Promise.all(
  items.map(
    item => handler(item).catch(error => null)
  )
);

或者,Promise.allSettled

const results = await Promise.allSettled(items.map(handler));

上面将产生一个对象数组。要查找成功通过的结果,请从拥有 value 的对象中提取它:

const truthyResults = results
  .map(({ value }) => value)
  .filter(value => value !== undefined);

【讨论】:

  • 太棒了,我将尝试第一个选项。很快就会回复你。 :)
猜你喜欢
  • 2020-08-03
  • 2020-12-27
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 2017-09-19
  • 2014-05-02
  • 1970-01-01
相关资源
最近更新 更多