在 typescript / javascript 中将 try / catch 标记为异步?

问题描述 投票:0回答:1

我在让以下代码进入错误的 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)

javascript angular typescript asynchronous promise
1个回答
0
投票

听起来您不想使用

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() 
功能完成。

© www.soinside.com 2019 - 2024. All rights reserved.