在Node.js中asynchronous添加到数组中

我对这种types的编程非常新,我从嵌套调用中填充数组时遇到了一些麻烦。 我很确定这需要使用callback来完成,但是我无法绕过它的大脑。 closures也必须在这里发挥作用。 我试图在网上search一个类似的例子,但没有发现太多。

这是我的原始代码。 我尝试了一些不同的方法,但没有把它closures。

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

我非常喜欢以下模式(recursion是asynchronous循环的最优雅的解决scheme):

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

检查asynchronous ,它有一个asynchronousforeach循环。

编辑

这里是asynchronous库的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); } }; 

你可以做这样的事情:
给formatAssignee一个callback。
记下需要推送到用户的用户数量。
在您推入最后一个之后,请使用参数users调用callback。