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

Javascript 当等待承诺被拒绝时,从异步函数返回而不完成的正确方法?,javascript,async-await,Javascript,Async Await,当等待承诺失败/拒绝时,您能告诉我终止异步函数的正确方法吗 在下面的代码中,当promisegetValue()拒绝时,最后的代码仍然尝试运行并使用r执行某些操作。至少,这是错误显示的状态。运行getValue()上的catch,然后try的catch声明函数出错,因为r在下面的“用r做点什么”部分的一行中是未定义的 为什么函数不在return或reject()时停止,如何在getValue()失败后停止 我意识到async/await与try/catch一起工作,这样错误就会像同步一样被捕获;

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

在下面的代码中,当promise
getValue()
拒绝时,最后的代码仍然尝试运行并使用
r
执行某些操作。至少,这是错误显示的状态。运行
getValue()
上的
catch
,然后
try
catch
声明函数出错,因为
r
在下面的“用r做点什么”部分的一行中是
未定义的

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

我意识到async/await与try/catch一起工作,这样错误就会像同步一样被捕获;但是我想为每一个等待失败的人做一些具体的事情,然后停下来,在那一点上返回

多谢各位

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 );
 }    
}

要拒绝
async
函数的承诺,您将抛出一个错误或允许抛出一个错误

通常,不要直接使用
.then
.catch
方法
await
是在
async
函数中使用承诺的方式(大体上)。您的代码正在捕获拒绝(通过使用
.catch
)并将其转换为值为
未定义的履行(通过不从拒绝处理程序函数返回任何其他内容)

但是使用
异步
函数和
等待
,拒绝变成错误,完成变成结果值。因此,通过执行
wait getValue
,您的意思是“如果
getValue
承诺被拒绝,
throw
拒绝;如果
getValue
得到满足,就得到满足值。”类似地,
async
函数中的
throw
会变成拒绝
async
函数返回的承诺,而
return
变成了实现它

因此,只需通过
wait
使用承诺,并允许错误(拒绝)传播到调用方:

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;
    }
}

在这种情况下,将值“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 );
 }    
}

“为什么函数不在return或reject()时停止?”因为
return
不在
afunc
中,所以它不会终止
afunc
拒绝
本身也不会停止该功能。通常情况下,您应该做的是非常非常简单的-您不应该有
.catch()
,因为这会将拒绝变成正常的完成。然而,这是一种错误处理机制,您已经将
异步
/
等待
与promise API混合在一起,这使得它很奇怪。此外,您还有一个
reject()
指示您也在手动尝试拒绝承诺。你不应该把这三种语言中的任何两种混用起来,我在新书《JavaScript:新玩具》的第8章和第9章中详细介绍了这一点。如果您感兴趣,请在我的个人资料中添加链接。谢谢。我又犯了一次相当愚蠢的错误,把JS函数当作void C函数来对待。如果我只是
返回“error”
然后检查它,它就会工作。我本想用
()
来调用函数。@Gary-但为什么要这样做,而不是使用
try
/
catch
?我不确定,只是函数中有许多
wait
语句;但我认为,对于每个
wait
函数,使用
try/catch
,而在整个函数上使用外部函数也同样好。也许在等待时处理错误,然后再次抛出它似乎有点奇怪。但我只是个新手,所以这可能是最好的做法;我不知道。我的主要观点是,我现在明白了为什么没有值的
return
没有停止函数执行。谢谢,谢谢。我现在明白了。我选择克劳德先生的答案是因为它比你的答案早两分钟,没问题。我们在这里什么都可以。