如何正确等待 TypeScript 中的承诺
How to correctly await a promise in TypeScript
我有一些代码,如果承诺拒绝或将其结果用于 要求 它是 reolved 类型的东西,我 continue
一个循环,如图所示在以下示例代码中:
for (const i in bar) {
let error = false;
const foo = await somePromise(i)
.catch(() => { error = true; });
if (error) continue;
// Something that requires foo to be resolved here
}
我的问题是打字稿没有意识到 foo
最后被正确解析(它仍然认为它可能是 void
由于没有正确解析,因此给出 2339
错误)。让打字稿意识到这没问题的正确、类型安全的方法是什么?
我发现修复它的方法是声明 foo
是 any
类型,这不理想而且我的 linter 不喜欢这样,或者使用 .then
,这也很糟糕,因为我必须开始在我的代码中嵌套多个 .then
语句和函数,导致大量缩进。
我会推荐
for (const i in bar) {
try {
const foo = await somePromise(i)
// Something that requires foo to be resolved here
// break???
} catch {
continue
}
}
或确实 then
,这并不难看,也不需要更多缩进(甚至嵌套):
for (const i in bar) {
const error = await somePromise(i).then(foo => {
// Something that requires foo to be resolved here
return false;
}, err => {
return true;
});
if (!error) {
// break???
}
}
我有一些代码,如果承诺拒绝或将其结果用于 要求 它是 reolved 类型的东西,我 continue
一个循环,如图所示在以下示例代码中:
for (const i in bar) {
let error = false;
const foo = await somePromise(i)
.catch(() => { error = true; });
if (error) continue;
// Something that requires foo to be resolved here
}
我的问题是打字稿没有意识到 foo
最后被正确解析(它仍然认为它可能是 void
由于没有正确解析,因此给出 2339
错误)。让打字稿意识到这没问题的正确、类型安全的方法是什么?
我发现修复它的方法是声明 foo
是 any
类型,这不理想而且我的 linter 不喜欢这样,或者使用 .then
,这也很糟糕,因为我必须开始在我的代码中嵌套多个 .then
语句和函数,导致大量缩进。
我会推荐
for (const i in bar) {
try {
const foo = await somePromise(i)
// Something that requires foo to be resolved here
// break???
} catch {
continue
}
}
或确实 then
,这并不难看,也不需要更多缩进(甚至嵌套):
for (const i in bar) {
const error = await somePromise(i).then(foo => {
// Something that requires foo to be resolved here
return false;
}, err => {
return true;
});
if (!error) {
// break???
}
}