Node.js:使用forEach控制流程

时间:2014-02-17 16:04:40

标签: arrays database json node.js control-flow

我正在尝试从数据库对象创建数组:

我有实体“组”,它有很多“设备”,我想为所有组创建数组,并为每个组创建他的设备列表:

[
{
    "group_id": “1”,
    "name": “My_group”,
    "devices_list": [1, 2, 18]
},
{
    "group_id": “2”,
    "name": “My_second_group”,
    "devices_list": [3, 24]
}
]

我尝试了几种这样的方式:

Group.all(function (err, groups) {
     var resJson = {};
     groups.forEach(function(group, index){
         group.devices(function(err, devices){
            resJson[index] = group;
            console.log(devices);
            resJson[index].devices_list = devices;

            //End of the loop
            if (index == groups.length -1){
                 send({code: 200, data: resJson});
            }
        });
    });
 });

编辑1:

我也是这样试过的:

var resJson = {};
groups.forEach(function(group, index){
    group.devices(function(err, devices){
        resJson[index] = group;
        resJson[index].devices_list = [];

        devices.forEach(function(device,index2){
            resJson[index].devices_list.push(device);
        });


        //End of the loop
        if (index == groups.length -1){
            send({code: 200, data: resJson});
        }
    });
});

但最后,我的resJson只包含空组(没有设备关联的组),其他组不可见。因此,我的devices_list全为空,而console.log(设备)显示设备。

似乎在处理非空组之前处理了“发送”指令。

这样做的方法是什么?

感谢您的时间

1 个答案:

答案 0 :(得分:0)

您可以使用after类型的构造,而不是根据列表的长度跟踪和使用索引。我真的很喜欢它们,它们很容易整合,并且能够完成 一段时间之后的完美目的。

首先,让我们定义一个你可以使用的后期函数。

var after = function(amount, fn) {
  var count = 0;
  return function() {
    count += 1;
    if (count >= amount) {
      fn.apply(arguments);
    }
  };
};

现在应该对你有用,让我们修改你的代码示例来使用它。

var json = []; // To return, you originally wanted an array.
Group.all(function(err, groups) {
  if (err) {
    // Handle the error
  } else {
    var sendJson = after(groups.length, function(json) {
      send({code: 200, data: json});
    });
    groups.forEach(function(group) {
      group.devices(function(err, devices) {
        if (err) {
          // Handle the error...
        } else {
          group.devices_list = devices;
          json.push(group); // This part is different, using this method you'll match the JSON you gave as your "goal"
        }
        // This is outside the if/else because it needs to be called for every group
        // regardless of change. If you do not call this the exact number of times
        // that you specified it will never fire.
        sendJson(json);
    });
  }
});

也许这样的事情可能会解决你的问题。