我正在尝试从数据库对象创建数组:
我有实体“组”,它有很多“设备”,我想为所有组创建数组,并为每个组创建他的设备列表:
[
{
"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(设备)显示设备。
似乎在处理非空组之前处理了“发送”指令。
这样做的方法是什么?
感谢您的时间
答案 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);
});
}
});
也许这样的事情可能会解决你的问题。