【发布时间】:2017-05-19 16:34:03
【问题描述】:
我正在使用在 nodejs (6.9.1) 上运行的sails (0.11.0)。我试图通过 for 循环填充它来构造一个数组。我会发送这个完整的数组以响应客户端。我已经尝试过 Stack Overflow 上人们建议的各种方法,例如
讨论here建议
for (var i = yearStart; i < yearEnd+1; i++) {
arr.push(i);
}
在this讨论中,建议使用:
var array = calendars.map(function(item) {
return item.id;
});
console.log(array);
同样,我尝试了很多方法,但我遇到了同样的问题,即在循环期间,数组被填充,但一旦循环完成,由于异步过程,数组变空,因此我无法发送响应.为了解决这个问题,我尝试检查循环体内的索引并通过
从循环体内发送响应var userArray = [];
_.each(users, function(user, index){
MySQLConnector.query('CALL user_image (?)', [user.id], function(err, userImage){
if(err){
return res.json({"status":"some_error"});
}else{
userID = user.id
userImageID = userImage[0][0].id;
var userInfo = {
userID: userID,
userImageID: userImageID
}
userArray.push(userInfo)
if(index == users.length - 1){
res.json({selectedUsers: userArray});
}
}
});
});
我正在初始化一个空的 userArray,然后遍历 users 对象,其中对象的每个元素都由名称 user 和一个 索引。通过 MySQL 查询,我获取 userImage 对象,并且在每次迭代中,我创建了一个名为 userInfo 的对象,该对象由 userID 和 组成>userImageID。我将这个对象推入 userArray。在 for 循环 (_.each) 的每次迭代之后,我检查是否达到最后一个索引。到达最后一个索引后,在循环主体完成之前将最终数组作为响应发送。
这里我也有一个问题,即数组主体并不总是完全填充。原因是由于异步过程,index并不总是遵循0,1,2,3,4,....的顺序,它可以从任意数字开始,可以跳转到任意索引在下一次迭代中,例如,第一个开始的索引是 4,第二个是 0,第三个是 2,依此类推。每次我们运行这个 for 循环时,这个顺序都会不同。对于用户来说,这似乎是一个完全随机的过程。因此,如果 users.length 为 8,并且当前索引在第三次迭代时随机为 7,则将满足条件 index == users.length - 1,并且将仅使用由 3 个元素组成的数组而不是 8 个元素发送响应。
有人可以建议我一种更好更健壮的方法来通过 nodejs 中的 for 循环填充数组并发送该数组作为响应,以便所有项目都按原始顺序包含在数组中?
【问题讨论】:
-
它不会按照顺序进行,我认为您也会遇到与地图相同的问题。看看 lodash 和 bluebird 中的 reduce,我知道后者会保证订单,我认为 lodash 会是一样的,但可能是错误的。
-
再想一想,在异步库中,我经常使用eachSeries,这也保证了顺序,并且可能是您现有代码的解决方案。
标签: arrays node.js asynchronous sails.js