Node.js 如何用Mongoose方法实现异步
我现在有以下代码:Node.js 如何用Mongoose方法实现异步,node.js,asynchronous,mongoose,Node.js,Asynchronous,Mongoose,我现在有以下代码: exports.listByUser = function(req, res) { Attack.find({user: req.user._id}, function(err, attacks) { if(err) return next(err); for(var i in attacks) { attacks[i].evaluateFight(); }
exports.listByUser = function(req, res) {
Attack.find({user: req.user._id}, function(err, attacks) {
if(err)
return next(err);
for(var i in attacks) {
attacks[i].evaluateFight();
}
res.json(attacks);
});
};
主要问题是攻击[i].evaluateFight()
是异步调用的,我想对其进行转换以确保[i-1]
迭代完成。。。最后调用res.json(攻击)
。我想,这是可以做到的,但我不知道如何:(像这样的东西应该工作,但我如何调用攻击。方法
async.eachSeries(attacks, function (callback) {
//something??
callback();
}, function (err) {
if (err) { throw err; }
res.json(attacks);
});
您可以利用
async
同时
方法调用来实现相同的功能。但是,我对evaluateFight
的回调有一个疑问,因为如果它是异步执行的,那么必须有一些回调与之关联,它将通知上一次调用是否成功
假设evaluateFight
在完成时返回回调,则示例代码如下-
exports.listByUser = function(req, res) {
Attack.find({user: req.user._id}, function(err, attacks) {
if(err)
return next(err);
var attacksLength = attacks.length;
var count = 0;
async.whilst(function () {
return count < attacksLength;
},
function (callback) {
attacks[count].evaluateFight(function(err, result){
count++;
callback();
}); // assuming it returns a callback on success
},
function (err) {
// all the iterations have been successfully called
// return the response
res.json(attacks);
});
};
exports.listByUser=函数(req,res){
Attack.find({user:req.user.\u id},函数(err,attacks){
如果(错误)
返回下一个(错误);
var attacksLength=attacks.length;
var计数=0;
while(函数(){
返回计数<攻击长度;
},
函数(回调){
攻击[计数]。evaluateFight(函数(错误,结果){
计数++;
回调();
});//假设它在成功时返回回调
},
功能(err){
//所有迭代都已成功调用
//返回响应
res.json(攻击);
});
};
Hi,感谢您的快速响应,但我不知道如何返回回调?mongoose.model('Game').findOneAndUpdate({'u-id':Game.id},{'set':something},函数(err,data){//return callback HERE};
mongoose.model('Game').findOneAndUpdate({'u-id':Game.id},{'set':something},函数(err,data){callback callback callback HERE})(err,data);//这是从async}传递的回调;
另外,您的evaluateFight
函数应该接受回调,作为evaluateFight(回调){mongoose.model('Game').findOneAndUpdate({'u id':Game.\u id},{'set':something},函数(err,data){callback callback(err,data);//这是从async})传递的回调;}