如何在TypeScript中正确等待承诺

问题描述

我有一些代码,如果一个Promise拒绝或将其结果与 required 的结果一起使用,则我会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,这不是理想的选择,而我的孩子也不喜欢,或者使用.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???
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...