处理多个承诺拒绝[重复]

Posted

技术标签:

【中文标题】处理多个承诺拒绝[重复]【英文标题】:Handling multiple promise rejections [duplicate] 【发布时间】:2019-11-02 06:38:56 【问题描述】:

This article 遍历各个 promise 组合器:

Promise.all

Promise.any

Promise.race

Promise.allSettled

但我看不到的是,一种运行所有承诺的方法,但在单个承诺拒绝时不会短路。如何确保所有承诺都运行,但我可以处理拒绝所有承诺的解决方案?

【问题讨论】:

你不是真的描述了allSettled提案吗? Promises 在你创建时运行。 “一种运行所有承诺的方法”——只需创建所有承诺,它们就会运行,就是这样。承诺也可以拒绝或解决,而不是两者兼而有之——“处理拒绝和解决所有问题”似乎与我的陈述相矛盾。考虑到这一点,您能否重新表述您的问题? 这里有多种解决方法:ES6 Promise.all() error handle - Is .settle() needed? 或Why does javascript's Promise.all not run all promises in failure conditions?。 【参考方案1】:

您可以将catch 添加到各个承诺中,以指示您希望错误如何出现在最终结果中。因为catch 返回一个promise,所以当您运行Promise.all 时,您将能够得到错误结果。例如:

// some promises:
let p = [
    Promise.resolve("val1"),
    Promise.reject("some error"),
    Promise.resolve("val3")
  ]
  
 let results = Promise.all(p.map(pr => 
       pr
       .then(v=> "value: " + v)
       .catch(e => "error: " + e)))  // add catch to prevent errors from stopping all()
  
 results.then(console.log)

【讨论】:

catch 不是必需的,实际上也不是为前面的then 调用提供第二个参数。 catch 处理 promise 的拒绝值,但它是使用前一个 promise 的拒绝处理程序返回的值创建的 promise,即正在创建和处理第二个 promise。简而言之,给定一个承诺AA.then(on_success).catch(on_failure)A.then(on_success, on_failure)是一回事。 我不确定我在哪里说过这两件事是相同的@amn。不过关于这个问题,请看:When is .then(success, fail) considered an antipattern for promises? 请放心,在您的 sn-p 中,使用 catch 是不必要的,不这样做也不会是反模式的情况。 Promise.all(p.map(pr => pr.then(value => (value), reason => (reason)))) 产生一个用一组 promise 解析的 promise,其中每个这样的 promise 用一个带有 value 属性的对象来解析,该对象引用原始封装的 promise 的解析值,或者一个带有 reason 属性的对象引用对于原始封装承诺的拒绝原因。与您的示例类似,但没有一个 then 一个 catch

以上是关于处理多个承诺拒绝[重复]的主要内容,如果未能解决你的问题,请参考以下文章

mongoose 的重复键错误处理和未处理的承诺拒绝

稍后赶上承诺拒绝[重复]

使用 fetch 时拒绝承诺 [重复]

等待但从未解决/拒绝承诺内存使用[重复]

在Angular 2中拒绝Promise时未处理的Promise拒绝[重复]

Angular 2 错误:未处理的承诺拒绝:模板解析错误:多个组件: