是在循环中调用API并使用异步等待的写方法

时间:2020-03-08 07:10:19

标签: javascript arrays node.js foreach async-await

我有一个数组arr,我想为它的每个元素循环。在循环中,我先调用两个fxns A(),然后调用B(),我想要的是循环将并行运行,但是对于每个元素,fxn A必须先运行,然后是fxnB。

我在做什么:

[1,2,3].forEach(async(i)=>{
await A(i);//which call API & console & returns iA 
await B(i);//which call API & console & returns iB  
console.log('A & B Completed for '+ i) 
 }  )

//Desired Result

1A
1B
A & B Completed for 1
3A //due to parallelism
3B
A & B Completed for 3
2A
2B
A & B Completed for 2

是写作还是其他好方法,请帮忙。

1 个答案:

答案 0 :(得分:0)

我想要的是循环将并行运行,但是对于每个元素fxn A必须先运行,然后fxn B。

您所拥有的将做到这一点。 .forEach()循环本身不会等待await,因为.forEach()不能保证可以感知。因此,.forEach()循环将一直运行到完成,从而(按顺序)开始每个循环迭代,因此它们都将同时“进行中”。它们将按顺序开始,但是在同时运行时,它们可以按任何顺序完成(由目标服务器确定)。

但是,按照这种方式进行操作,您就无法在循环之外就错误,结果甚至完成情况进行交流。

因此,通常最好收集一个诺言数组并使用Promise.all()来监视诺言的完成(当您要并行运行事物时)。这将为您提供所有您缺少的三件事:

  1. 完成通知
  2. 正确的错误处理
  3. 按顺序收集结果

您可以这样做:

let promises = [1,2,3].map(async(i) => {
    let resultA = await A(i);//which call API & console & returns iA 
    let resultB = await B(i);//which call API & console & returns iB  
    console.log('A & B Completed for '+ i)
    return someValue; 
});

Promise.all(promises).then(results => { 
    console.log(results);
}).catch(err => {
    console.log(err);
});