【发布时间】:2021-01-07 15:43:46
【问题描述】:
我知道应该通过错误处理来处理被拒绝的承诺。
但是,我怀疑这段代码不起作用:
public myFunction(): Promise<number>
{
try {
return this.doThingAsync(...); //Returns a promise
} catch (e) {
return Promise.resolve(7); //Fallback value
}
}
既然第一个return 立即返回了promise,那么try/catch 是不是没有机会处理promise 被拒绝的情况?我查看了转译的 JavaScript 并没有看到任何特别之处,即使我将函数标记为 async。
因此,await 需要 处理被拒绝的承诺以在 TypeScript 中工作而不使用 JavaScript 中较旧的 then/catch 语法?
根据我对 Promise 的理解,我希望以下内容起作用:
public async myFunction(): Promise<number>
{
try {
const result = await this.doThingAsync(...);
return result;
} catch (e) {
return 7; //Fallback value
}
}
【问题讨论】:
-
当你用
async注释一个函数时,它会隐式返回一个 Promise。你的函数不是异步的,所以你必须明确地返回一个。你不需要await,只需return Promise.resolve(7); -
某事已经存在了一段时间并不意味着应该避免它。您仍在使用
return,并且一直存在! TypeScript 是 JavaScript 的超集;这意味着 TypeScript 中总会有 JavaScript 的语法。实际上,此处显示的代码中唯一在 JavaScript (ES2020) 中无效的是public和: Promise<number>。 -
“我怀疑这段代码行不通”:你为什么不先测试一下?然后你会发现它工作或不工作,你可以问一些与你实际运行的代码有关的东西。
-
@Sildoreth Rejections 在您使用
await时会导致异常,是的,但这不是 TypeScript 特有的功能。我倾向于关闭 Difference betweenreturn await promiseandreturn promise的副本 -
Promise rejections in TypeScript result in exceptions and can be handled with try/catch没有。不,他们没有。 Typescript 是一个静态类型系统。它编译了。它在运行时不存在,因此它不能以与 Javascript 不同的方式“处理 Promises”,事实上它在运行时根本不处理值。这与 Typescript 有任何关系的唯一原因是编译器(正确地)警告您,您认为您从函数返回的内容并不是您实际上的内容 在所有情况下都返回。
标签: typescript promise