Javascript 当等待承诺被拒绝时,从异步函数返回而不完成的正确方法?
当等待承诺失败/拒绝时,您能告诉我终止异步函数的正确方法吗 在下面的代码中,当promiseJavascript 当等待承诺被拒绝时,从异步函数返回而不完成的正确方法?,javascript,async-await,Javascript,Async Await,当等待承诺失败/拒绝时,您能告诉我终止异步函数的正确方法吗 在下面的代码中,当promisegetValue()拒绝时,最后的代码仍然尝试运行并使用r执行某些操作。至少,这是错误显示的状态。运行getValue()上的catch,然后try的catch声明函数出错,因为r在下面的“用r做点什么”部分的一行中是未定义的 为什么函数不在return或reject()时停止,如何在getValue()失败后停止 我意识到async/await与try/catch一起工作,这样错误就会像同步一样被捕获;
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
没有停止函数执行。谢谢,谢谢。我现在明白了。我选择克劳德先生的答案是因为它比你的答案早两分钟,没问题。我们在这里什么都可以。