Javascript/node.js中的异步循环

Asynchronous loops In Javascript/node.js

本文关键字:异步 循环 js node Javascript      更新时间:2023-09-26

我正在使用node js和postgresql。我尝试一次插入多个查询。

数组列表:

var keywordsData =  [ { name: 'demo', count: 69 }, { name: 'healthy', count: '22' }, { name: 'cooking', count: '12' }, { name: 'food', count: '9' }, { name: 'home', count: '9' }, { name: 'organic', count: '7' }, { name: 'live', count: '6' }, { name: 'openmrs', count: '6' }];

Javascript代码:

   for (var indexs in keywordsData) {
          var item = keywordsData[indexs].name;
          var count = keywordsData[indexs].count;
          var goalId = 10;
          console.log("first" + indexs);
          if (item.length > 1) {
          client.query("insert into real_keywords(reference_id,keyword,keyword_count) values('" + goalId + "','" + item + "','" + count + "')", function(err, result) {
          console.log("last" + indexs);
          });
          }
    }

输出我像这样:

first0
first1
first2
first3
first4
first5
first6
first7
last7
last7
last7
last7
last7
last7
last7
last7

预期产出:

first0
last0
first1
last1
first2
last2
first3
last3
first4
last4
first5
last5
first6
last6
first7
last7

请任何人都可以提出解决此问题的最佳方法。

for 循环是同步的,而您正在运行的 postgres 查询是异步的 - 循环在迭代之前不会等待数据库回调。

完成这项工作的最简单方法可能是使用异步库的each函数。例如:

 var async = require('async'),
     values = [{ name: 'demo', count: 69 }, { name: 'healthy', count: '22' }];
async.each(values, function (value, done) {
    client.query('Some query using value.name and value.count', function (err, result) {
        // query is finished
        done(err, result);
    });
 }, function (err) {
      // all queries have finished
 });