我有一个userIDs数组(MongoDB Objectid
),我想迭代它,并为每一个,在我的MongoDB用户数据库中找到它的用户条目,并更新它,比如修改用户的年龄。然后,只有在每个用户都更新后,我才能在res.send(200);
Express应用中说出Node.js
。
我开始使用以下代码,由于对findById
的异步调用,这是完全错误的:
for (var i = 0; i < userIDs.length; i++) {
var userID = userIDs[i];
User.findById(userID, function (err, user) {
if (err) throw err;
// Update user object here
user.save(function (err, user) {
if (err) throw err;
res.send(200);
});
});
}
我有什么想法可以做到这一点?可能是findById
的同步版本吗?或者也许是通过数组map
的方法并将函数应用于每个元素?
谢谢!
答案 0 :(得分:2)
我想你想要npm的forEach
模块的async
方法。它看起来像这样:
async.forEach(userIDs, function(id, callback) {
User.findById(id, function(err, user){
if(err) throw err;
user.save(function(err, user){
if(err) throw err;
callback();
}
}, function(err){
if(err){
throw err;
} else {
res.send(200);
}
}
}
答案 1 :(得分:2)
最好的方法是使用承诺。
Q#all的一个例子:
var q = require('Q');
var promises = userIDs.map(function(userID){
var deferred = q.defer();
User.findById(userID, function (err, user) {
if (err) return deferred.reject(err);
// Update user object here
user.save(function (err, user) {
if (err) return deferred.reject(err);
deferred.resolve(user);
});
});
return deferred.promise;
});
q.all(promises)
.then(function(users){
res.json(users);
})
.fail(function(err){
res.send(500,err);
});