将两个 Promise 链接在一起并返回第二个 Promise 的类型的优雅方法?

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

我是 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,这与我想要的相反。

有这样做的惯用方法吗?

javascript promise finally
1个回答
0
投票
function chained(): Promise<number> {
    return P1().catch(console.error).then(P2);
}

插入一个空的

catch
以抑制任何失败,然后简单地链接
P2
。在这里,我使用
console.error
作为捕获处理程序,因为它看起来很有用,但您也可以使用
() => {}
完全抑制它。

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