首页 > 解决方案 > 如何解决 UnhandledPromiseRejectionWarning?

问题描述

我最近学习了 javascript,但我无法理解 Promise 的概念。这是一个片段,我希望会发生异常。

async function testRepository(): Promise<void> {
    throw new Error('error');
};

async function testService(): Promise<void> {
    try {
        return await testRepository();
    } catch (err) {
        throw err;
    }
};

async function testController(): Promise<void> {
    try {
        return await testService();
    } catch (err) {
        throw err;
    }
}

(async () => {
    try {
        console.log(await testController());
    } catch (err) {
        throw err;
    }
})();

运行 tat 代码时,我收到以下错误消息:

(node:16670) UnhandledPromiseRejectionWarning: Error: error
    at /home/pellegrini/temp/webservices/test.js:42:19
    at step (/home/pellegrini/temp/webservices/test.js:33:23)
    at Object.next (/home/pellegrini/temp/webservices/test.js:14:53)
    at /home/pellegrini/temp/webservices/test.js:8:71
    at new Promise (<anonymous>)
    at __awaiter (/home/pellegrini/temp/webservices/test.js:4:12)
    at testRepository (/home/pellegrini/temp/webservices/test.js:40:12)
    at /home/pellegrini/temp/webservices/test.js:54:42
    at step (/home/pellegrini/temp/webservices/test.js:33:23)
    at Object.next (/home/pellegrini/temp/webservices/test.js:14:53)
(node:16670) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:16670) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

你能告诉我那个代码有什么问题并让它工作吗?通过工作,我的意思是如果我正确理解 Promise 的概念,就会产生一个错误。

标签: javascript

解决方案


问题是您不断重新抛出错误,并且永远不会在任何地方处理它。所以它会不断冒泡,直到它产生一个 UnhandledPromiseRejectionWarning。

你只需要在某个时候通过处理错误来打破这个链条。例如:

async function testService(): Promise<void> {
    try {
        return await testRepository();
    } catch (err) {
        console.log('got an error');
        //throw err; // Don't re-throw
    }
};

推荐阅读