2015-09-02 2 views
0

Я пытался написать код, который записывает строки в мою базу данных. это:async code in forEach loop nodejs

  • принимает offer объект (зависимость)

  • считывает с предложением объекта в items массив с помощью обратного вызова (зависимость)

  • перебирает каждый элемент

  • занимает некоторое значения от offer и item объектов

  • читает из БД некоторые статистические данные, чтобы определить ценность предмета

  • пишет выше полей две линии на массив

  • толкает массив в массив массивов

  • использует этот массив для вставки строки в БД

function WriteToDB(object) { 
    object.getItems(function (err, items) { 
    var rowlist = []; 
    items.forEach(function (item) { 
    var field1 = offer.name; 
    var field2 = item.name; 
    var field3 = getItemValue(item.name); //async db call 
    var row = [field1, field2, field3]; 
    rowlist.push(row); 
    }); 

    write(valuelist); 
} 

я знаю, что это wont work, но я не могу показать grok nodejs достаточно, чтобы выяснить, как решить эту задачу, которую нужно выполнить на других языках. Я перепутал с обучением async.waterfall, но запутался, потому что синхронный цикл foreach смешался в цепочке другого довольно асинхронного материала.

ответ

1

Вы можете использовать модуль асинхронной, как:

var async = require('async'); 

function WriteToDB(object) { 

    object.getItems(function (err, items) { 
     var rowlist = []; 

     async.each(items, function (item, cb) { 
      var field1 = offer.name; 
      var field2 = item.name; 
      getItemValue(item.name, function (value) { 
       var field3 = value; 
       var row = [field1, field2, field3]; 
       rowlist.push(row); 
       cb(); 
      }); //async db call 

     }, function() { 

      // All async read are completed here 
      write(rowlist); 
     }); 
    }); 
}; 
0

Вы можете использовать библиотеку я только что созданный под названием utils-pkg, который имеет функцию с именем .each(), который перебирает каждый элемент из объекта или массива. Это не синхронно, но с обратным вызовом вы можете продолжить следующую итерацию, когда его спросило

Также функция имеет другой параметр обратного вызова, который выполняется один раз все итераций выполняются

Проверьте пакет here

var utils = require("utils-pkg"); 

function WriteToDB(object) { 
    object.getItems(function (err, items) { 
     var rowlist = []; 

     utils.each(items, function(index, value, next){ 
      var field1 = offer.name; 
      var field2 = value.name; 
      var field3 = getItemValue(value.name); //async db call 
      var row = [field1, field2, field3]; 

      rowlist.push(row); 
      next(); // call this once you are done with this iteration 
     }, function(){ 
      // This is called when all iterations are done 
      write(valuelist); 
     }); 
    }); 
}