【问题标题】:Passing an error from one async function to another将错误从一个异步函数传递到另一个
【发布时间】:2018-10-12 09:15:36
【问题描述】:

我有一个复杂的系统,它完全适用于 async/await。我想要的是在一个且仅 try/catch 块中处理来自异步函数的多种类型的错误。这意味着我从另一个异步函数调用此函数。
但是在父异步函数中处理异常的概念似乎失败了。在下面的示例中,我得到的只是关于未处理的承诺拒绝的警告,并且父级中的 catch 块永远不会出错。我也尝试过简单的抛出和错误,但也没有成功。

const die = (word) => new Promise((resolve, reject) => reject(word));

const live = () => new Promise((resolve, reject) => resolve(true));

const daughterAsync = async () => {
    await live();
    try {
        await die('bye');
    } catch (err) {
        return Promise.reject(err);
    }
    try {
        await die('have a beatiful time');
    } catch (err) {
        return Promise.reject(err);
    }
    await live();
};

const parentAsync = async () => {
    try {
        daughterAsync();
    } catch(err) {
        console.log('error catched'); // never happens
        console.log(err);
    }
};

parentAsync();

我有一种感觉,我对执行这种特技的异步函数一无所知

【问题讨论】:

  • 请注意:在async 函数中,您不需要写return Promise.reject(err);,您可以只写throw err

标签: javascript async-await


【解决方案1】:

您的daughterAsync(); 行仅启动承诺运行,但不会保存对它的引用或等待它解决。您需要在parentAsynctry 块内awaitdaughterAsync 返回的承诺,以便catch daughterAsync 中的错误:

const die = (word) => new Promise((resolve, reject) => reject(word));

const live = () => new Promise((resolve, reject) => resolve(true));

const daughterAsync = async () => {
    await live();
    try {
        await die('bye');
    } catch (err) {
        return Promise.reject(err);
    }
    try {
        await die('have a beatiful time');
    } catch (err) {
        return Promise.reject(err);
    }
    await live();
};

const parentAsync = async () => {
    try {
        await daughterAsync();
    } catch(err) {
        console.log('error catched');
        console.log(err);
    }
};

parentAsync();

【讨论】:

    猜你喜欢
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多