我在让以下代码进入错误的 catch 块时遇到问题,
try {
this.doSomething();
} catch (error) {
console.error(error);
}
如果“doSomething”返回承诺/运行异步代码。
doSomething() {
return new Promise<void>((resolve, reject) => {
this.MySubscription = this.myService.fetchUserDataFromDB().subscribe({
next: (val: any) => {
this.userData = val
resolve()
}, error: (error) => {
let uiErrorMsg = 'Failed to fetch user data';
let consoleErrorMsg = 'Error occurred when calling backend API fetchUserDataFromDB';
if (error instanceof HttpErrorResponse) {
consoleErrorMsg += ` | Status: ${error.status} ${error.statusText} | URL: ${error.url}`;
}
const consoleError = new Error(consoleErrorMsg);
if(error?.status != 401) {
const data = [{ title: 'Alert', message: [uiErrorMsg] }, { okButtonTitle: 'Close' }]
let dialogRef: any = this.dialog.open(ConfirmationModalComponent, {data});
// await firstValueFrom(dialogRef.afterClosed())
}
reject(consoleError);
}
})
})
}
有些地方我需要调用
this.doSomething()
并不关心它何时完成,而其他地方我确实关心,在这些情况下,当我希望代码等到它完成后再继续执行时,请将单词 await
放在前面。下一行。
await this.doSomething();
显然有一种方法可以捕获承诺的错误而不等待它,但它采用不同的语法:
this.doSomething().catch(error => {
console.error(error);
});
因此,在我需要等待它完成的地方,我会像人们所期望的那样使用带有“await”的 try/catch ,但是当我不关心它何时完成时,我需要用“.catch()”来调用它,而不是用“.catch()”来调用它try/catch 来捕获错误。
是否有计划允许将 try 块标记为异步,以便我们可以在两种情况下保留 try/catch 语法,这样我们就不需要两种不同的语法,并且可以与 try/catch 可靠的其他编程语言更加一致在预期的时候进入 catch 块?
比如类似的事情
try async {
this.doSomething()
} catch (error) {
console.error(error)
}
和
try {
await this.doSomething()
} catch (error) {
console.error(error)
}
分别?
幸运的是,我的 try catch 的目的只是为了以视觉上令人愉悦的方式处理错误消息的打印。但我可以想象这会给依赖输入 catch 块的人带来很大的挫败感,无论他们是否使用“await”调用函数。
有没有办法让 try/catch 异步,还是我们需要同时维护 .catch() 语法和 try/catch 语法?
(我使用的是 typescript 4.9.5,rxjs 7.8.1)
听起来您不想使用
await
的原因是您不想阻止代码块的其余部分运行。
我建议您始终使用
await
而不要使用 .then()
/.catch()
,而是使用异步 IIFE:
(async () => {
try {
await this.doSomething()
} catch (error) {
console.error(error)
}
})()
// ... code here should run without waiting for `doSomething()` to complete
现在,
doSomething()
函数的同步开始将立即执行,并且一旦await
函数内有doSomething()
,原始代码块的其余部分将继续执行,而无需等待doSomething()
功能完成。