当前位置: 首页 > 知识库问答 >
问题:

有没有可能在Promise.all?[复制]中抓住所有被拒绝的promise

阚吕恭
2023-03-14

鉴于以下情况

Promise.all(promises).then(resolved => {
    ...
}).catch(rejected => {
    ...
});

拒绝只会包含第一个被拒绝的promise。有没有办法抓住所有被拒绝的promise?

共有2个答案

百里俭
2023-03-14

等待所有promise得到解决(解决或拒绝)的通常方法是使用类似于Promise.settle()的东西。您可以在这里看到它的几种不同变体:ES6 Promise.all()错误句柄-是否需要。定居()?

基本概念是,您用一个包装器包装每个promise,该包装器捕获(并保存)它们的拒绝,并将它们转换为解析,然后将这些生成的promise传递给Promise.all()。因为你传递给Promise.all()的所有promise都会解决(没有一个会拒绝),所以它会等待所有promise。但是,生成的值将是一个数组,您可以迭代该数组以查看哪些promise已解决,哪些已拒绝:

您会这样使用它:

Promise.settle(arrayOfPromises).then(function(results) {
    results.forEach(function(pi, index) {
        if (pi.isFulfilled()) {
            console.log("p[" + index + "] is fulfilled with value = ", pi.value());
        } else {
            console.log("p[" + index + "] is rejected with reason = ", pi.reason());
        }
    });
});

有关Promise.solution()的实际代码,请参见上面的链接帖子,以避免在此处重复。

云令
2023-03-14

当然,要做到这一点,需要等待所有的输入promise都得到解决。只要有一个待处理,可能会被拒绝,你就不能确定你有所有的拒绝!

因此,您可以使用Promise.all,但在转换输入promise以捕获拒绝并识别它们之后,可以将它们包装在错误对象中,如中所示

caughtPromises = promises.map(promise => promise.catch(Error));

现在过滤Promise.all的结果以查找被识别为失败的结果:

Promise.all(caughtPromises)
  .then(results => results.filter(result => result instanceof Error))

等等。

 类似资料:
  • 假设我有一组正在发出网络请求的,其中一个将失败: 假设我想等到所有这些都完成了,不管有没有一个失败了。可能有一个网络错误的资源,我可以生存没有,但如果我可以获得,我想要在我继续。我想优雅地处理网络故障。 由于没有为此留出任何空间,那么在不使用promissions库的情况下,处理此问题的推荐模式是什么?

  • 问题内容: 我有一个奇怪的错误。我通过命令行以root用户身份登录到本地Mysql。创建数据库后: 然后给某些用户特权: 这给出了错误: 根目录的权限(显示授予;)显示: 我还要确保以root用户身份登录: 这确认我以“ root” @“ localhost”的身份登录 我已经创建了数据库并多次分配了用户,但从未遇到问题。为什么以root用户身份登录时无法将用户分配给root用户创建的数据库? P

  • 问题内容: 我为我使用的API提供了一个速率限制器,它每秒允许20个请求。所有请求均基于承诺,并且一旦有响应,承诺将使用API​​数据进行解析。 问题: 我设置了一个promiseArray,其中包含58k个都在等待响应的Promise。如此缓慢地增加内存,直到内存用完。在我的特定情况下,我不需要将解析的数据传递给我,并且数据耗尽了我所有的RAM。 编码: 那么,有没有一种方法可以等待到promi

  • 行动时刻 - 拒绝没有领域的请求 以下步骤将演示如何拒绝没有领域的请求: 编辑FreeRADIUS配置目录下的proxy.conf文件,并确保my-org.com域没有nostrip指令(它包含在上一个练习中)。 编辑已sites-enabled/default(启用站点的/默认文件),并在授权部分中的后缀条目之后添加以下unlang代码。 这将拒绝任何没有领域的用户名请求: if( reques

  • 问题内容: 内容: 我想说的是: 问题答案: 一种方法是手动处理此问题: 使用包装(扩展) 只要设置了值,就保留()线程和值 或者,通过一些反射(和),您可以: 呼叫 调用(针对上述每个线程) 呼叫 第一是更优选的。

  • 问题内容: 通过将此Applet与JDBC结合使用,我将获得以下错误 问题答案: 如果不采取措施为小程序赋予适当的权限,您将无法在小程序中运行JDBC。Oracle 的本教程详细介绍了该主题。