【问题标题】:async code in forEach loop nodejsforEach循环nodejs中的异步代码
【发布时间】:2015-09-02 05:26:17
【问题描述】:

我一直在尝试编写一些将行写入数据库的代码。它:

  • 采用offer 对象(依赖)

  • 通过回调(依赖)从offer对象读取items数组

  • 迭代每个项目

  • offeritem 对象中获取一些值

  • 从 db 中读取一些统计数据以确定项目的值

  • 将上面两行的字段写入数组

  • 将数组推入数组数组

  • 使用此数组将行插入到数据库中

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);
}

我知道这行不通,但我似乎无法 grok nodejs 弄清楚如何用其他语言解决这个简单的任务。我在学习 async.waterfall 时搞砸了,但因为在原本相当异步的东西链中混合了一个同步 foreach 循环而感到困惑。

【问题讨论】:

    标签: database node.js asynchronous io


    【解决方案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);
            });
        });
    };
    

    【讨论】:

      【解决方案2】:

      您可以使用我刚刚创建的名为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);
              });
          });
      }
      

      【讨论】:

        猜你喜欢
        • 2018-03-06
        • 1970-01-01
        • 2018-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-15
        • 1970-01-01
        相关资源
        最近更新 更多