Ich habe eine match
Funktion, die Paare oder Teilpaare zwei Exchange-Wetten zusammen. Zuerst schrieb ich eine ordentliche Funktion, aber es war synchron (mit for-Schleifen) und jetzt habe ich Probleme beim Übersetzen in asynchronen Code mit verschachtelten Callbacks und dem async
Paket. Ich werde bis jetzt unter meine synchrone und asynchrone Funktion einfügen. Im Moment erhalte ich Fehler im asynchronen Code, weil Cannot read property '_id' of undefined
aber _id
aus der in results
gespeicherten Abfrage abgerufen wird.Asynchrone Mongoose Calls
Async Funktion
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 Funktion
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 ist asynchron, so dass Sie es nicht so verwenden können 'var results = Bet.find (...)' die einfachste Möglichkeit ist, 'exec' hinzuzufügen -> 'Bet.find (...). Sort (...). Exec (Funktion (err, results) {async.forEach (Ergebnisse, ...)});' – Molda