所以我使用异步,这个函数会输出一些id和计数结果但不会"回调"
getWaitingGames: function(req,res){
var me = req.session.passport.user;
var rez=[];
console.log("meeeeeeeeee");
console.log(me);
GivenQuestion.find().where({user_id:me}).exec(function(err,data){
var tpm_id = data[0].partie_id;
console.log(tpm_id);
console.log(data);
async.each(data, function(d, callback) {
var parties = [];
if (d.partie_id != tpm_id){
console.log(d.partie_id);
parties.push(d.partie_id);
tpm_id=d.partie_id;
GivenQuestion.count().where({
partie_id: d.partie_id,
user_id: me
}).exec(function(e, countRes) {
console.log(countRes);
if (countRes==2){
rez.push(d.partie_id);
callback();
}
});
}
}, function(err) {
if (err) {
console.log(error);
}
else{
console.log("callback");
res.ok(rez);
}
});
});
},
为什么?我找不到想要我做错了,似乎与文档中的相同,我之前以同样的方式使用过它
编辑:是的我可以把回调放在if之后,就像你们建议的那样但是我得到一个空的rez。为什么? async只能工作一个级别吗? (我的意思是,这里我在2 .exec())
答案 0 :(得分:2)
代码中存在一个小问题。对于 async.each 方法,在作为处理函数的第二个参数中,我们必须调用 callback()来移动到下一个元素。如果我们不打电话给回调(),那么永远不会失效。
在您的情况下,您仅在if (countRes==2)
时拨打回拨(),但其他方案如何?在其他情况下 async.each()将等待回调()来处理数据中的下一项,但由于我们没有调用callback()所以等待它
解决方案:在if (countRes==2)
之外拨打 callback()。请查看以下代码段以获取更多详细信息:
GivenQuestion.count().where({
partie_id: d.partie_id,
user_id: me
}).exec(function(e, countRes) {
console.log(countRes);
if (countRes==2){
rez.push(d.partie_id);
}
callback();
});
如果您仍然发现问题,请退回。
答案 1 :(得分:1)
需要两个输入才能更深入地了解该问题:
您是否检查过条件 if(countRes == 2)会导致 true ?因为如果此条件评估为错误, rez 将始终为空。
如果 if(countRes == 2)评估为 true ,那么 d.partie_id 的值是多少情况?
请提供这些输入。
此外, async.each 可以在多个级别上运行。我做了一个实现,我在异步内部使用async。所以,它看起来不像异步的错误。