【问题标题】:Chain thens using an array [duplicate]然后使用数组链接 [重复]
【发布时间】:2019-04-04 22:20:00
【问题描述】:

我正在寻找一种将多个 Promise 链接在一起的方法,类似于 Promise.all,但我希望每个 Promise 都等待最后一个。我确定这可能已经得到解答,但我想我不知道该用谷歌搜索什么。

function output(msg) {
 return new Promise((resolve,reject) => {
  console.log(msg);
  resolve();
 });
}

output('1st').then(() => {
 output('2nd').then(() => {
  output('3rd').then(() => {
   console.log('done')
  });
 });
});

// I want to be able to build from an array of length n
const msgs = ['1st','2nd','3rd'];

for(let i = 0; i < msgs.length;i++){
 // Not sure what to do here
 output(msgs[i]).then(() => {
  output(msgs[i+1]);
 });
}

【问题讨论】:

标签: javascript node.js


【解决方案1】:

您可以在数组上使用forEach 之类的循环,并在async function 内使用await

function output(msg) {
 return new Promise((resolve,reject) => {
  console.log(msg);
  resolve();
 });
}
const msgs = ['1st','2nd','3rd'];
function ArrPromiseAll(arr) {
  arr.forEach(async function(i) {
    await output(i);
  });
  console.log("Done All.");
}
ArrPromiseAll(msgs);

输出:

1st
2nd
3rd
Done All.

【讨论】:

    【解决方案2】:

    您可以像这样链接它们以避免像地狱一样嵌套:

    output('a')
        .then(a_out => output('b'))
        .then(b_out => output('c'))
        .then(c_out => console.log('all done'));
    

    对于Promise&lt;T&gt;[]的序列:

    let loopback = (arr, i=0) => {
        return arr[i].then(() => {
            if (i < arr.length - 1)
                return loopback(arr, i+1);
        });
    };
    
    let last = loopback(load);
    

    【讨论】:

      猜你喜欢
      • 2019-08-06
      • 2016-10-22
      • 2014-02-03
      • 2019-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多