如何优雅地将承诺上的长链更改为在typescript中并行?

如何优雅地将承诺上的长链更改为在typescript中并行?,typescript,Typescript,原始代码如下所示: new Promise<void>((resolve) => { resolve(); }) .then(() => { return 1; }) .then((res1) => { return res1 + 1; }) .then((res2) => { return res2 + 1 }) .then((res3) => { return res3 + 1 }) . .then((sum)

原始代码如下所示:

new Promise<void>((resolve) => {
    resolve();
})
.then(() => {
    return 1;
})
.then((res1) => {
    return res1 + 1;
})
.then((res2) => {
    return res2 + 1
})
.then((res3) => {
    return res3 + 1
})
.
.then((sum) => {
    console.log("I am the end! the sum is " + sum);
})
新承诺((解决)=>{
解决();
})
.然后(()=>{
返回1;
})
。然后((res1)=>{
返回res1+1;
})
。然后((res2)=>{
返回res2+1
})
。然后((res3)=>{
返回res3+1
})
.
。然后((总和)=>{
log(“我结束了!总和是”+sum);
})
但是代码越来越长,所以我想使用
Promise.all()
;因此,程序应该是:

  • 初始化
  • 并行进行所有计算(顺序无关紧要)
  • 最后总结一下
  • 如何恰当地实现这一点?我是否可以将每个阶段作为一个独立的功能,以便更具可读性


    如果我使用
    Promise.all()
    ,我必须传递一个承诺数组吗?

    这里有一种方法,使用
    Promise.all()
    等待所有计算,然后使用
    array.reduce()
    将所有结果相加

    
    const originalPromise=新承诺(resolve=>resolve());
    const firstCalculation=新承诺(resolve=>resolve(1));
    const secondCalculation=新承诺(resolve=>resolve(2));
    const thirdCalculation=新承诺(resolve=>resolve(3));
    const fourthCalculation=新承诺(resolve=>resolve(4));
    我保证([
    第一次计算,
    第二次计算,
    第三次计算,
    第四次计算
    ])。然后(结果=>{
    常数和=结果。减少((acc,电流)=>acc+=电流,0);
    log(`sum是${sum}`);
    });
    
    这里有一种方法,使用
    Promise.all()
    等待所有计算,然后使用
    Array.reduce()
    将所有结果相加为一个总和

    
    const originalPromise=新承诺(resolve=>resolve());
    const firstCalculation=新承诺(resolve=>resolve(1));
    const secondCalculation=新承诺(resolve=>resolve(2));
    const thirdCalculation=新承诺(resolve=>resolve(3));
    const fourthCalculation=新承诺(resolve=>resolve(4));
    我保证([
    第一次计算,
    第二次计算,
    第三次计算,
    第四次计算
    ])。然后(结果=>{
    常数和=结果。减少((acc,电流)=>acc+=电流,0);
    log(`sum是${sum}`);
    });
    
    目前尚不清楚如何承诺。当本例依赖于承诺按顺序解决时,所有的都会有所帮助,要求先解决前一个承诺,然后才能解决当前承诺。考虑使用ASYNC/Access来简化这段代码。@斯宾德,你说得对,绝对不是一个好例子。但我想表达的是,顺序并不重要,因为结果是一样的。不清楚如何
    承诺。当本例依赖于承诺按顺序解决时,所有的
    都会有所帮助,要求先解决前一个承诺,然后再解决当前承诺。考虑使用ASYNC/Access来简化这段代码。@斯宾德,你说得对,绝对不是一个好例子。但是我想表达的是,序列并不重要,因为结果是一样的。因为在开始的时候,每个阶段都会返回一个数组,所以每次我只是简单地添加它。但是现在返回类型很奇怪(不再是平面数组了)。。我怎样才能将它们展平?@Michael只需在
    之前添加
    .flatMap(it=>it)
    。减少
    @Minami谢谢!我发现,
    [].concat(…a,…b)
    也能工作。嗨@Yanick bélanger,我用这种方法遇到了一个问题。因为在开始的时候,每个阶段都会返回一个数组,所以每次我只是简单地添加它。但是现在返回类型很奇怪(不再是平面数组了)。。我怎样才能将它们展平?@Michael只需在
    之前添加
    .flatMap(it=>it)
    。减少
    @Minami谢谢!我发现,
    [].concat(…a,…b)
    也能工作。