У меня есть функция match
, которая объединяет пары или частичные пары двух обменных ставок. Сначала я написал аккуратную функцию, но она была синхронной (используя для циклов), и теперь мне трудно перевести ее в асинхронный код, используя вложенные обратные вызовы и пакет async
. До сих пор я буду прикрепляться ниже моей синхронной и асинхронной функции. На данный момент я получаю ошибки в асинхронном коде, потому что Cannot read property '_id' of undefined
, но _id
извлекается из запроса, хранящегося в results
.Асинхронные вызовы Mongoose
Асинхронный Функция
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);
}
}
});
}});
}
Bet.find является асинхронным, так что вы не можете использовать его как это 'результатов вар = Bet.find (...)' самый простой вы можете сделать, это добавить 'exec' -> 'Bet.find (...). Sort (...). Exec (function (err, results) {async.forEach (results, ...)});' – Molda