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

当等待承诺被拒绝时,从异步函数返回而不完成的正确方法?

  •  0
  • Gary  · 技术社区  · 5 年前

    当等待承诺失败/拒绝时,您能告诉我终止异步函数的正确方法吗?

    在下面的代码中,当承诺 getValue() 拒绝,最后的代码仍然尝试运行并使用 r . 至少这个错误看起来是这么说的。这个 catch getValue() 运行,然后 抓住 try 声明函数出错是因为 r undefined

    为什么函数不在return或reject()时停止,以及如何让它在return或reject()后停止 getValue() 失败?

    async function afunc() {
     try {
       var r = await getValue().catch( (err) => {
                  console.log( "Error in getValue" ); 
                  console.log(err);
                  r = "error";
                  return;
               } );
    
        if ( r === "error" ) reject();
        /* do something with r */
      }
    catch ( e )
     {
       console.log( "error in afunc" );
       console.log( e );
     }    
    }
    
    2 回复  |  直到 5 年前
        1
  •  0
  •   T.J. Crowder    5 年前

    拒绝某人的诺言 async

    一般来说,不要使用 .then .catch 方法。 await 异步 .接住 )并将其转化为价值的实现 undefined (不从拒绝处理函数返回任何其他内容)。

    但与 异步 功能和 等待 ,拒绝成为错误,履行成为结果值。所以通过这样做 await getValue getValue throw 拒绝;如果 同样地, 异步 功能变成拒绝承诺 异步 函数返回,并且 return 变成实现它。

    所以只要用承诺通过 等待 并允许错误(拒绝)传播到调用者:

    async function afunc() {
        var r = await getValue; // Slightly odd this is an identifier reference, not a function call
    
        /* do something with r */
    }
    

    或者如果你在传播之前需要对拒绝做些什么:

    async function afunc() {
        try {
            var r = await getValue; //
    
            /* do something with r */
        } catch (e) {
            /* do something with `e`, then rethrow it */
            throw e;
        }
    }
    
        2
  •  1
  •   Giovanni Fersan    5 年前

    在这种情况下,将值:“error”传递给变量r中的变量r。 若要返回“error”,必须在父变量中返回此值才能进行检查。

    async function afunc() {
     try {
       var r = await getValue.catch( (err) => {
                  console.log( "Error in getValue" ); 
                  console.log(err);
                  var result = "error";
                  return result;
               } );
    
        if ( r === "error" ) reject();
        /* do something with r */
      }
    catch ( e )
     {
       console.log( "error in afunc" );
       console.log( e );
     }    
    }