Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.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 Async for each loop node.js typescript_Javascript_Node.js_Typescript_Asynchronous_Foreach - Fatal编程技术网

Javascript Async for each loop node.js typescript

Javascript Async for each loop node.js typescript,javascript,node.js,typescript,asynchronous,foreach,Javascript,Node.js,Typescript,Asynchronous,Foreach,我尝试从async为每个循环调用数据库操作。我有以下代码 let succussCounter = 0; let failureCounter = 0; let mydata=[101,102,104,105]; myData.forEach(async data => { let response = await DbConnector.updateSampleTable(data); if(response){

我尝试从async为每个循环调用数据库操作。我有以下代码

let succussCounter = 0;
let failureCounter = 0;

let mydata=[101,102,104,105];

myData.forEach(async data => {
          let response =
              await DbConnector.updateSampleTable(data);
          if(response){
            succussCounter ++;
          }else{
            failureCounter++;
          }
 });

      console.log('succussCounter = ' + succussCounter);
      console.log('failureCounter = ' + failureCounter);

我想在完成整个循环后打印成功计数和失败计数。但这总是打印两个都是0。

您需要学习一点wait-async

forEach不适用于您的案例,因为它是同步的,它不等待任何东西。因此,在代码控制台中,日志是在foreach有时间运行任何查询之前运行的

这是我最喜欢的选项:(它按顺序运行db查询)

这里是另一个选项,它更接近您的代码,但在我看来可读性较差。但在parralel中运行查询具有优势

await Promises.all(myData.map(async data => {
          let response =
              await DbConnector.updateSampleTable(data);
          if(response){
            succussCounter ++;
          }else{
            failureCounter++;
          }
});
console.log(...);

Array.prototype.forEach
始终是同步的。您的console.log总是在回调完成之前执行。使用一个好的ol'
循环,循环中包含
wait
(顺序),或
Promise.all()
(并行)
await Promises.all(myData.map(async data => {
          let response =
              await DbConnector.updateSampleTable(data);
          if(response){
            succussCounter ++;
          }else{
            failureCounter++;
          }
});
console.log(...);