我对这种类型的编程很新,我在嵌套调用中填充数组时遇到了一些麻烦。我很确定这需要使用回调来完成,但是我在绕着它缠绕脑子时遇到了麻烦。关闭也必须在这里发挥作用。我尝试在网上搜索类似的例子,但没有找到太多。
这是我的原始代码。我尝试了一些不同的方法,但没有把它拉下来。
TaskSchema.statics.formatAssignee = function(assignees) {
var users = [];
assignees.forEach(function(uid) {
mongoose.model('User').findById(uid, function(err, user) {
users.push({
name: user.name.full
, id: user.id
});
});
});
return users;
}
答案 0 :(得分:6)
我非常喜欢以下模式(递归是异步循环最优雅的解决方案):
TaskSchema.statics.formatAssignee = function(assignees, callback) {
var acc = []
, uids = assignees.slice()
(function next(){
if (!uids.length) return callback(null, acc);
var uid = uids.pop()
mongoose.model('User').findById(uid, function(err, user) {
if (err) return callback(err);
acc.push({
name: user.name.full
, id: user.id
});
next();
});
})();
}
答案 1 :(得分:2)
签出async,它有一个异步的foreach循环。
修改强>
中的foreach方法async.forEach = function (arr, iterator, callback) {
if (!arr.length) {
return callback();
}
var completed = 0;
_forEach(arr, function (x) {
iterator(x, function (err) {
if (err) {
callback(err);
callback = function () {};
}
else {
completed += 1;
if (completed === arr.length) {
callback();
}
}
});
});
};
var _forEach = function (arr, iterator) {
if (arr.forEach) {
return arr.forEach(iterator);
}
for (var i = 0; i < arr.length; i += 1) {
iterator(arr[i], i, arr);
}
};
答案 2 :(得分:0)
你可以这样做:
给formatAssignee一个回调
减少推送用户所需的用户数量
在推送最后一个之后,使用参数users
调用回调。