2015-06-10 5 views
0

Я работаю с узлами js и postgresql. Я попытался вставить несколько запросов за раз.Асинхронные циклы В Javascript/node.js

ArrayList:

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 

Пожалуйста, любой может предложить лучший способ решить эту проблему.

+0

Хорошо, это немного не соответствует теме, поэтому не добавляйте его в качестве ответа. Ответ @IyadAssaf правильный в отношении async. Но вы должны проверить два других бита для своих SQL-запросов 1) Не знаете, что такое размер 'indexes', но вы можете вставлять сразу все свои строки. http://stackoverflow.com/questions/6889065/inserting-multiple-rows-in-mysql 2) Вы должны рассмотреть возможность использования подготовленного оператора вместо конкатенации строк. http://www.postgresql.org/docs/9.2/static/sql-prepare.html –

ответ

2

Цикл for является синхронным, тогда как запрошенный постгерс является асинхронным - цикл не ждет обратного вызова базы данных перед повторением.

Возможно, самый простой способ сделать эту работу - использовать функцию 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 
}); 
+0

вы должны использовать каждый цикл в массиве, карта используется для возврата нового массива – throrin19

+0

Хорошо, я изменил ответ соответственно – IyadAssaf

Смежные вопросы