异步 Mongoose 调用
Asynchronous Mongoose Calls
我有一个 match
函数可以将两个交换赌注配对或部分配对在一起。起初我写了一个简洁的函数,但它是同步的(使用 for 循环),现在我无法使用嵌套回调和 async
包将它转换为异步代码。到目前为止,我将粘贴在我的同步和异步函数下面。目前,我在异步代码中遇到错误,因为 Cannot read property '_id' of undefined
但 _id
是从存储在 results
.
中的查询中提取的
异步函数
match : function(){
var results = Bet.find({"paired" : false}, {_id:1, bet:1, market:1, odds:1, student:1, to_match:1, stake:1})
.sort({createdAt : 1});
async.forEach(results, function(doc, callback){
var result = doc[0];
var id = result._id;
var stake = result.stake;
var odds = result.odds;
var market = result.market;
var student = result.student;
var side = result.bet;
var to_match = result.to_match;
var opp_results = Bet.find({"student":student, "market":market, "paired":false, "settled":false,
"bet": {$ne : side}, "_id" : {$ne : id}});
async.forEach(opp_results, function(opp_doc, callback2){
var temp_to_match = to_match;
var array = opp_doc[0];
var opp_id = array._id;
console.log("Comparing " + id + " with " + opp_id);
var opp_paired = array.paired;
var opp_to_match = array.to_match;
var opp_settled = array.settled;
if(temp_to_match <= opp_to_match){
temp_to_match -= opp_to_match;
opp_to_match -= temp_to_match;
if(temp_to_match <= 0){
paired = true;
}
if(opp_to_match <= 0){
opp_paired = true;
}
}
}, callback);
}, function(err){
console.log("done");
});
}
同步功能
sync_match : function(){
Bet.find({"paired" : false}, {_id:1, bet:1, market:1, odds:1, student:1, to_match:1, stake:1})
.sort({createdAt : 1})
.then(function(doc){
for(var j = 0; j < doc.length; j++){
var result = doc[j];
var id = result._id;
var stake = result.stake;
var odds = result.odds;
var market = result.market;
var student = result.student;
var side = result.bet;
var to_match = result.to_match;
Bet.find({"student":student, "market":market, "paired":false, "settled":false,
"bet": {$ne : side}, "_id" : {$ne : id}}).then(function(results){
for(var i = 0; i < results.length; i++){
var temp_to_match = to_match;
var array = results[i];
var opp_id = array._id;
console.log("Comparing " + id + " with " + opp_id);
var opp_paired = array.paired;
var opp_to_match = array.to_match;
var opp_settled = array.settled;
if(temp_to_match <= opp_to_match){
temp_to_match -= opp_to_match;
opp_to_match -= temp_to_match;
if(temp_to_match <= 0){
paired = true;
}
if(opp_to_match <= 0){
opp_paired = true;
}
console.log("we made it this far);
}
}
});
}});
}
(更新:这个解决方案有一个小错误。由于某种原因,当一个字段配对时,它应该停止,但是它会继续配对和配对..)
根据 Molda 的建议,我设法获得了一个有效的异步解决方案:
match : function(){
Bet.find({"paired" : false}, {_id:1, bet:1, market:1, odds:1, student:1, to_match:1, stake:1})
.sort({createdAt : 1}).exec(function(err, results){
async.forEach(results, function(doc, callback){
var id = doc._id;
var stake = doc.stake;
var odds = doc.odds;
var market = doc.market;
var student = doc.student;
var side = doc.bet;
var to_match = doc.to_match;
Bet.find({"student":student, "market":market, "paired":false, "settled":false,
"bet": {$ne : side}, "_id" : {$ne : id}}).exec(function(errs, res){
async.forEach(res, function(opp_doc, callback2){
var temp_to_match = to_match;
var opp_id = opp_doc._id;
var opp_student = opp_doc.student;
var opp_paired = opp_doc.paired;
var opp_to_match = opp_doc.to_match;
var opp_settled = opp_doc.settled;
if(temp_to_match <= opp_to_match){
var update_to_match = temp_to_match - opp_to_match;
var update_opp_to_match = opp_to_match - temp_to_match
if(update_to_match <= 0){
paired = true;
update_to_match = 0;
}
if(update_opp_to_match <= 0){
opp_paired = true;
update_opp_to_match = 0;
}
Bet.update({"_id" : id},
{$set : {'to_match': update_to_match,'paired' : paired}}
,{new : true, multi: true}).exec(function(err){
if(err)
throw err;
});
Bet.update({"_id" : opp_id},
{$set : {'to_match': update_opp_to_match, 'paired' : opp_paired}}
,{new : true, multi:true}).exec(function(err){
if(err)
throw err;
});
}
}, function(err){
if(err){
throw err;
}
callback();
})});
}, function(err){
console.log("done");
})});
}
我有一个 match
函数可以将两个交换赌注配对或部分配对在一起。起初我写了一个简洁的函数,但它是同步的(使用 for 循环),现在我无法使用嵌套回调和 async
包将它转换为异步代码。到目前为止,我将粘贴在我的同步和异步函数下面。目前,我在异步代码中遇到错误,因为 Cannot read property '_id' of undefined
但 _id
是从存储在 results
.
异步函数
match : function(){
var results = Bet.find({"paired" : false}, {_id:1, bet:1, market:1, odds:1, student:1, to_match:1, stake:1})
.sort({createdAt : 1});
async.forEach(results, function(doc, callback){
var result = doc[0];
var id = result._id;
var stake = result.stake;
var odds = result.odds;
var market = result.market;
var student = result.student;
var side = result.bet;
var to_match = result.to_match;
var opp_results = Bet.find({"student":student, "market":market, "paired":false, "settled":false,
"bet": {$ne : side}, "_id" : {$ne : id}});
async.forEach(opp_results, function(opp_doc, callback2){
var temp_to_match = to_match;
var array = opp_doc[0];
var opp_id = array._id;
console.log("Comparing " + id + " with " + opp_id);
var opp_paired = array.paired;
var opp_to_match = array.to_match;
var opp_settled = array.settled;
if(temp_to_match <= opp_to_match){
temp_to_match -= opp_to_match;
opp_to_match -= temp_to_match;
if(temp_to_match <= 0){
paired = true;
}
if(opp_to_match <= 0){
opp_paired = true;
}
}
}, callback);
}, function(err){
console.log("done");
});
}
同步功能
sync_match : function(){
Bet.find({"paired" : false}, {_id:1, bet:1, market:1, odds:1, student:1, to_match:1, stake:1})
.sort({createdAt : 1})
.then(function(doc){
for(var j = 0; j < doc.length; j++){
var result = doc[j];
var id = result._id;
var stake = result.stake;
var odds = result.odds;
var market = result.market;
var student = result.student;
var side = result.bet;
var to_match = result.to_match;
Bet.find({"student":student, "market":market, "paired":false, "settled":false,
"bet": {$ne : side}, "_id" : {$ne : id}}).then(function(results){
for(var i = 0; i < results.length; i++){
var temp_to_match = to_match;
var array = results[i];
var opp_id = array._id;
console.log("Comparing " + id + " with " + opp_id);
var opp_paired = array.paired;
var opp_to_match = array.to_match;
var opp_settled = array.settled;
if(temp_to_match <= opp_to_match){
temp_to_match -= opp_to_match;
opp_to_match -= temp_to_match;
if(temp_to_match <= 0){
paired = true;
}
if(opp_to_match <= 0){
opp_paired = true;
}
console.log("we made it this far);
}
}
});
}});
}
(更新:这个解决方案有一个小错误。由于某种原因,当一个字段配对时,它应该停止,但是它会继续配对和配对..)
根据 Molda 的建议,我设法获得了一个有效的异步解决方案:
match : function(){
Bet.find({"paired" : false}, {_id:1, bet:1, market:1, odds:1, student:1, to_match:1, stake:1})
.sort({createdAt : 1}).exec(function(err, results){
async.forEach(results, function(doc, callback){
var id = doc._id;
var stake = doc.stake;
var odds = doc.odds;
var market = doc.market;
var student = doc.student;
var side = doc.bet;
var to_match = doc.to_match;
Bet.find({"student":student, "market":market, "paired":false, "settled":false,
"bet": {$ne : side}, "_id" : {$ne : id}}).exec(function(errs, res){
async.forEach(res, function(opp_doc, callback2){
var temp_to_match = to_match;
var opp_id = opp_doc._id;
var opp_student = opp_doc.student;
var opp_paired = opp_doc.paired;
var opp_to_match = opp_doc.to_match;
var opp_settled = opp_doc.settled;
if(temp_to_match <= opp_to_match){
var update_to_match = temp_to_match - opp_to_match;
var update_opp_to_match = opp_to_match - temp_to_match
if(update_to_match <= 0){
paired = true;
update_to_match = 0;
}
if(update_opp_to_match <= 0){
opp_paired = true;
update_opp_to_match = 0;
}
Bet.update({"_id" : id},
{$set : {'to_match': update_to_match,'paired' : paired}}
,{new : true, multi: true}).exec(function(err){
if(err)
throw err;
});
Bet.update({"_id" : opp_id},
{$set : {'to_match': update_opp_to_match, 'paired' : opp_paired}}
,{new : true, multi:true}).exec(function(err){
if(err)
throw err;
});
}
}, function(err){
if(err){
throw err;
}
callback();
})});
}, function(err){
console.log("done");
})});
}