【问题标题】:Asynchronous loops In Javascript/node.jsJavascript/node.js 中的异步循环
【发布时间】:2015-06-10 19:55:32
【问题描述】:

我正在使用节点 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

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

【问题讨论】:

标签: javascript node.js postgresql


【解决方案1】:

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

可能最简单的方法是使用async 库的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
 });

【讨论】:

  • 你应该使用 each 循环数组,map 用于返回新数组
猜你喜欢
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 2015-04-11
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多