2017-02-03 2 views
0

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); 
        } 
       } 

      }); 

    }}); 
} 
+1

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

Antwort

0

(Update:. Diese Lösung einen leichten Fehler aus irgendeinem Grund, wenn ein Feld gepaart wird, sollte es jedoch stoppen es hält Paarung und Paarung ..)

Von Moldas Vorschlag gelang es mir Holen Sie sich eine funktionierende asynchrone Lösung:

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"); 
    })}); 
}