尽管有几个`try`-`catch`块,但仍得到UnhandledPromiseRejection警告

时间:2019-02-14 22:01:50

标签: javascript node.js promise async-await

我正在使用环绕其API的第三方模块。我有以下代码:

def current_ability
  @current_ability ||= Ability.new(current_admin_user)
end

尽管有两个const api = require('3rdpartyapi'); async function callAPI(params) { try { let result = await api.call(params); return result; } catch(err) { throw err; //will handle in other function } } async function doSomething() { try { //...do stuff let result = await callAPI({a:2,b:7}); console.log(result); } catch(err) { console.error('oh no!', err); } }-try块,当第三方API失去与Homebase的连接时(常常发生:(),炸毁:

catch

其次:

(node:13128) UnhandledPromiseRejectionWarning: FetchError: request to https://www.example.com failed, reason: getaddrinfo ENOTFOUND

我的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(). (rejection id: 1) -try为何都没有抓住这个机会?究竟什么是未处理的,以及如何实际处理呢?

1 个答案:

答案 0 :(得分:2)

重点是,等待仅将“第一层”拒绝转换为错误,但是promise可以在内部具有promise,并且它们的库可能无法捕获内部的拒绝。我做了3rdpartyapi的概念证明,它可以触发您看到的行为:


(async function () {

// mock 3rdpartyapi
var api = {
    call: async function(){
        await new Promise((resolve, reject) => {
            // why wrap a promise here? but i don't know
            new Promise((innerResolve, innerReject) => {
                innerReject('very sad'); // unfortunately this inner promise fail
                reject('this sadness can bubble up');
            })
        })
    }
};

// your original code
async function callAPI(params) {
    try {
        let result = await api.call(params);
        return result;
    } catch (err) {
        throw err; //will handle in other function
    }
}

async function doSomething() {
    try {
        //...do stuff
        let result = await callAPI({
            a: 2,
            b: 7
        });
        console.log(result);
    } catch (err) {
        console.error('oh no!', err);
    }
}

doSomething();

})();

输出:

$ node start.js
oh no! this sadness can bubble up
(node:17688) UnhandledPromiseRejectionWarning: very sad
(node:17688) 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(). (rejection id: 1)
(node:17688) [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.