[英]How to wait for moongose to finish query?
router.post('/logout', function(req, res) {
if(req.body.newList){
var aux= JSON.parse(req.body.newList);
var aux1;
var i=0;
while(i<aux.length){
aux1=aux[i];
Task.findOne({username:aux1.username,text:aux1.text},function(err,res){
if(res){
i++;
}else{
task= new Task({username:aux1.username,text:aux1.text,state:aux1.state});
task.save(function(err){
i++;
});
}
});
}
}
好吧,到目前為止,我已經知道了。 aux存儲了一個json對象數組,它們沒有_id
,所以..我需要遍歷它們,並在需要時逐個保存。 問題是(我認為)是異步的,因為此代碼僅在數據庫中將數組的最后一個元素保存n次,即應保存的n個不同元素的數量**(請參見示例)。 因此,我認為moonggose查詢的異步行為讓我頭疼。 可能保持迭代以等待查詢結果,然后保存數組的最后一個值。
**例如,如果我有這些值用於保存[{username:'x',text:'a'},{username:'x',text:'aa'},{username:'x',text:'aaa'}]
..
它保存[{username:'x',text:'aaa'},{username:'x',text:'aaa'},{username:'x',text:'aaa'}]
我曾嘗試使用諾言,但沒有成功。。可能是錯誤地使用了諾言
對於這種情況,我更喜歡使用caolan的異步庫。 只需做:
npm install async
添加模塊。
然后將代碼替換為:
router.post('/logout', function(req, res) {
if (req.body.newList) {
var aux = JSON.parse(req.body.newList);
var async = require("async");
async.each(aux, function(aux1, callback) {
Task.findOne({
username: aux1.username,
text: aux1.text
}, function(err, res) {
if (res) {
callback();
} else {
task = new Task({
username: aux1.username,
text: aux1.text,
state: aux1.state
});
task.save(function(err) {
callback();
});
}
});
}, function(err) {
// if any of the query processing produced an error, err would equal that error
if (err) {
// One of the iterations produced an error.
// All processing will now stop.
console.log('A query failed to process');
} else {
console.log('All queries have been processed successfully');
//do other things here
}
});
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.