繁体   English   中英

在 Promise.all 中使用 Try/Catch

[英]Using Try/Catch with Promise.all

我最近一直在阅读有关 async/await 并使用 try 和 catch 来处理承诺拒绝的内容,并将其应用于我的一些旧代码。

我有以下几点:

async function() {
    try {
        await Promise.all([some functions]);
        doIfNoError();
    } catch (error) {
        console.log(error);
    }

我传递给 Promise.all 的函数遵循以下形式:

async function() {
    some code
    if (some condition) {
        return true
    } else {
        throw false
    }
 }

我打算如果任何传递给 Promise.all 的函数被拒绝,就会显示拒绝。 如果没有一个函数拒绝,那么 doIfNoError 应该触发。 但是,doIfNoError 有时会在不应该触发时触发,并且我会收到错误“未处理的承诺拒绝”。

实际上, try/catchPromise.all()配合Promise.all()很好

这是一个片段来证明它:

 async function p1() { return 1; } async function boom() { throw new Error('boom'); } // expected output: 'boom', ["value before Promise.all"] async function asyncCall() { let all = ['value before Promise.all']; try { all = await Promise.all([p1(), boom()]); } catch(e) { console.log(e.message); } console.log(JSON.stringify(all)); } asyncCall();

尝试充分发挥 Promise 的潜力,其中包括一个用于被拒绝的 Promise 的 catch 块。 请注意,如果doIfNoError也抛出错误,它将被catch

async function() {
    await Promise.all([some promises])
    .then(doIfNoError) // Promise.all resolved
    .catch(console.log) // Promise.all has at least one rejection
}

 promiseAll = async (promises) => { await Promise.all(promises) .then(doIfNoError) // Promise.all resolved .catch(console.log) // Promise.all has at least one rejection } doIfNoError = () => console.log('No errors'); promiseAll([Promise.resolve(), 1, true, () => (false)]); promiseAll([Promise.resolve(), 1, true, Promise.reject('rejected: because reasons'), Promise.resolve()]);

1) throw false - 这没有意义,你不应该抛出一个布尔值,而是一个Error的实例。

2) catch仅在抛出错误或承诺被“拒绝”时触发(注意:reject 和 throw 与 async-await 具有相同的效果)。 相比之下:“解析”布尔值为false的承诺不会被 async-await 解释为异常。 因此,如果您希望捕获块启动,请确保throw错误或拒绝承诺。如果您reject ,请将异常作为参数传递给拒绝,例如 ( Promise.reject(new Error("Something went wrong")) .

除了我上面提到的,你的代码看起来不错。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM