代码之家  ›  专栏  ›  技术社区  ›  TheLovelySausage

Node.js wait catch不返回

  •  1
  • TheLovelySausage  · 技术社区  · 6 年前

    我正忙于处理一些代码,这些代码以一种意想不到的方式(对我)响应。它涉及处理Node.js promise异常。

    我修改了下面的函数,因此它所做的一切都是失败的

    function asynFunc() {
        return new Promise(function(res, rej) {
    
            rej("GENERIC ERROR");
    
        });
    }
    

    当我试图调用它并处理这个错误时,问题就出现了。如果我按预期执行以下操作,函数将失败并执行返回的catch,从而停止执行最后一个控制台日志

    async function appStart() {
    
        try {
            await asyncFunc();
        } catch(log) {
            console.log(log);
            return;
        }
    
        console.log("YOU SHOULD NOT SEE THIS");
    
    }
    
    appStart();
    

    如果我按如下方式编写函数,它似乎不会返回,它仍然执行最后一个控制台日志,而不管等待

    async function appStart() {
    
        await asyncFunc().catch(function(log) {
            console.log(log);
            return;
        });
    
        console.log("YOU SHOULD NOT SEE THIS");
    
    }
    

    如果这是我认为它在做的事情,那么返回是从catch内部的函数返回的,而不是appStart函数本身,或者我完全错了,在这种情况下,我不知道它为什么不返回。

    有没有办法使用第二个catch方法,并且仍然让它从调用函数返回?

    2 回复  |  直到 6 年前
        1
  •  5
  •   Mark    6 年前

    在第二个示例中,您不是从catch中的外部函数返回,而是从catch回调返回:

    await asyncFunc().catch(function(log) {
        console.log(log);//  ^
        return;          //  | returns from that function
    });
    

    这样做的效果是捕捉错误并继续前进,并将新的承诺解析为未定义的承诺。无法从回调内部控制外部函数的返回。您需要从外部函数测试异步操作的结果,这将使您 try/catch 或者在承诺解决后显式测试结果。

        2
  •  1
  •   Andrew Li    6 年前

    你说得对。它只在 catch 回调,而不是外部异步函数。这就是为什么它退出 抓住 回调并解析,然后记录“您不应该看到这个”。一般来说,如果你把承诺混在一起是很难理解的 then 抓住 async / await try / 抓住 . 选择一个并坚持它,因为混合它们可能导致无法无缝地捕捉和处理错误。