2017-02-03 7 views
0

У меня есть функция 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); 
        } 
       } 

      }); 

    }}); 
} 
+1

Bet.find является асинхронным, так что вы не можете использовать его как это 'результатов вар = Bet.find (...)' самый простой вы можете сделать, это добавить 'exec' -> 'Bet.find (...). Sort (...). Exec (function (err, results) {async.forEach (results, ...)});' – Molda

ответ

0

(Update:. Это решение имеет небольшую ошибку, почему-то, когда одно поле получает в паре, он должен остановиться, однако он сохраняет спаривание и сопряжение ..)

Из предложения 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"); 
    })}); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^