我是 JavaScript 新手,我有一个关于 Promise 链的问题。我有两个承诺,想要返回一个执行 P2 after P1 的承诺,无论 P1 成功还是失败,并根据 P2 返回
Promise<number>
。
所以对于这样的事情:
async function P1() : Promise<void> {
console.log("P1");
}
async function P2() : Promise<number> {
console.log("P2");
return 1;
}
function chained() : Promise<number> {
// Something here!
}
chained().then( (x) => {console.log(x);} )
预期输出应该是:
[LOG]: "P1"
[LOG]: "P2"
[LOG]: 1
据我所知,我可以这样做:
P1().then(P2, P2); // <--- returns Promise<number>
这是我想要的结果,但它很难看,因为 P2 被提到了两次。理想情况下,我会像这样使用
finally
来做到这一点:
P1().finally(P2); // <--- returns Promise<void>
但是这返回了 P1 的类型并丢弃了 P2,这与我想要的相反。
有这样做的惯用方法吗?
function chained(): Promise<number> {
return P1().catch(console.error).then(P2);
}
插入一个空的
catch
以抑制任何失败,然后简单地链接P2
。在这里,我使用 console.error
作为捕获处理程序,因为它看起来很有用,但您也可以使用 () => {}
完全抑制它。