【问题标题】:async array function not catching error - UnhandledPromiseRejectionWarning [duplicate]异步数组函数未捕获错误 - UnhandledPromiseRejectionWarning [重复]
【发布时间】:2021-03-08 15:47:33
【问题描述】:

我无法从内置异步数组函数中正确抛出错误,我收到以下错误 - (node:12104) UnhandledPromiseRejectionWarning: Error: non existent item provided

这显然与错误是从 forEach() 异步函数中抛出的事实有关,因为如果我将它抛出该函数之外,它会被正确捕获。

功能:

async myFunction(obj) {
    obj.items.forEach(async item => {
        if (itemDict[item]) {
            // do something
        } else {
            throw new Error('non existent item provided');
        }
    });
}

测试:

describe('type.js', async function() {
    it('throws error if non existent item is provided', async function() {
        try {
            const type = new Type();                
            await type.myFunction({
                items: ['item']
            });
            expect.fail('test failed');
        } catch (err) {
            expect(err.message).to.be.equal('non existent item provided');
        }  
    });
});

我尝试将 forEach() 包装在一个额外的 try/catch 块中,但得到相同的错误,并且永远不会触发 catch 块。

async myFunction(obj) {
    try {
        obj.items.forEach(async item => {
            if (itemDict[item]) {
                // do something
            } else {
                throw new Error('non existent item provided');
            }
        });
    } catch (err) {
        console.log('caught');
    } 
}

我哪里错了?

【问题讨论】:

  • @EmielZuurbier 这不是我实际使用的,我已经更新了我的示例。谢谢。

标签: javascript node.js promise async-await try-catch


【解决方案1】:

由于“forEach”不是异步的,在其中使用异步可能会出现很多问题。
如果你想在循环中使用异步,有一种使用“for”循环的方法。 或者,对我来说,更好的方法是在 Promise.all 中使用 ma​​p 中的异步。
由于异步函数返回Promise,因此您将并行执行所有承诺。

Promise.all(elements.map(async(elem) => elem)));

这是link 解释上述所有内容。

【讨论】:

    【解决方案2】:

    你可以试试 for 循环。

    像这样:

    async myFunction(obj) {
        for (const item of obj.items) {
            if (itemDict[item]) {
                // do something
            } else {
                throw new Error('non existent item provided');
            }
        });
    }
    

    【讨论】:

    • 这行得通 - 谢谢!但是最初的实现有什么问题呢?
    • forEach 不接受异步
    猜你喜欢
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 2020-08-24
    • 2018-04-20
    • 2020-11-22
    • 2020-09-12
    • 2021-10-20
    • 2021-11-18
    相关资源
    最近更新 更多