Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在循环中调用API和使用异步等待是一种写方法吗_Javascript_Arrays_Node.js_Foreach_Async Await - Fatal编程技术网

Javascript 在循环中调用API和使用异步等待是一种写方法吗

Javascript 在循环中调用API和使用异步等待是一种写方法吗,javascript,arrays,node.js,foreach,async-await,Javascript,Arrays,Node.js,Foreach,Async Await,我有一个数组arr,我想循环它的每个元素。在循环中,我先调用两个fxn A(),然后调用B(),我想要的是循环将并行运行,但对于每个元素,fxn A必须先运行,然后再运行fxn B 我正在做的是: [1,2,3].forEach(async(i)=>{ await A(i);//which call API & console & returns iA await B(i);//which call API & console & returns iB

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

我正在做的是:

[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
是书写还是其他好方法,请帮忙

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

你所拥有的一切都能做到。
.forEach()
循环本身不会等待
等待
,因为
.forEach()
不支持承诺。因此,
.forEach()
循环将一直运行到完成,开始每个循环迭代(按顺序),这样它们将同时处于“运行中”。它们将按顺序开始,但同时在飞行中运行时,它们可以按任何顺序完成(由目标服务器确定)

但是,你这样做的方式,你没有任何方式在循环之外交流错误或结果,甚至完成

因此,通常最好(当您希望并行运行时)收集承诺数组并使用
Promise.all()
监视其完成情况。这将给你所有三件你错过的东西:

  • 完工通知
  • 正确的错误处理
  • 按顺序收集结果
  • 你可以这样做:

    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);
    });
    

    这是可行的,但最好是不平行地将承诺返回给外部(或者正确处理可能的错误)。并用于()loop@CertainPerformance意味着我应该使用catch?@Deryck是forEach按顺序连续运行的吗?唯一可以实现并行的方法是使用辅助进程或辅助线程(在节点中)或web/服务辅助进程。但对于你发布的“按顺序”运行的内容——可能不是。forEach不在乎等待。如果您需要排序,请使用for(){…}或使用
    Promise.resolve()
    进行reduce,同时返回
    Promise.then()
    每次迭代。