2016-11-13 5 views
1
entry.find(function(err,user){ 
    for(var i=0;i<user.length;i++){ 
    if(user[i].tablenumber==-1){ 

     assigntable(user[i]); 
    } 
    } 

}); 

Also versuche ich hier zu warten, bis jede Schleife beendet ist, bevor ich die asynchrone Assignent-Funktion aufgerufen habe. Assigntable ist ein Rückruf, um Änderungen an der Datenbank vorzunehmen. Das Problem, das ich gerade habe, ist, da der Callback des Assigentables aufgerufen wird, nachdem die For-Schleife beendet ist. Alle Benutzer werden Tabelle 1 zugewiesen. Aber was ich will ist: Zuweisen der ersten zu Tabelle 1 -> Tabelle in nächste Schleife zuweisen erkennt, dass Tabelle 1 zugewiesen ist -> Benutzer 2 ist Tabelle 2 zugewiesen usw. Wie mache ich das?Wie erzwinge ich, dass eine for-Schleife darauf wartet, dass ein Callback in nodejs endet?

Bearbeiten: Assgintable ist ein rekursiver Aufruf, der die Datenbank in einem Rückruf bearbeitet. Das Update basiert auf dem Ergebnis der resultierenden Datenbank aus der vorherigen Schleife, aber ich bin hier nicht relevant.

function assigntable(user,tableindex){ 
    console.log("in recursion with tableindex"+tableindex); 
    if(tableindex==3) 
    return; 
    console.log(user.date+user.time+tableindex); 
    entry.find({ 
     $and: [ 
      { "tablenumber": tableindex}, 
      { "date": user.date }, 
      {"time":user.time} 
      ] 
    },function(err, result) { 
     if(result.length==0){ 
     console.log(result+"result is "); 
     entry.update({"_id":user._id},{"tablenumber":tableindex},function(err, numberAffected) { 
      if(!numberAffected){ 

      } 
      else 
      { 
      console.log("entryupdated with "+tableindex) 
      } 
     }); 
     return; 
    } 
    else{ 
    console.log(tableindex); 
    assigntabe(user,tableindex+1); 
    } 
}) 

}

+0

Hat 'assigntable()' zurückgeben 'Promise'? – CodingWithSpike

+0

nur um zu verdeutlichen - Sie wollen Assigntable für Benutzer [0] fertigstellen, bevor Assigntable für Benutzer [1] heißt? der Kommentar über die Rekursion ist auch etwas verwirrend, kannst du mehr Code zur Klärung einbeziehen? – skav

+0

@skav ja Ich möchte Assigntable für Benutzer [0] fertigstellen, bevor assigntable für Benutzer [1] heißt –

Antwort

1

Sie async.foreach, um synchron iterieren verwenden können:

entry.find(function(err,user){ 
    async.forEach(user, function (item, callback){ 
    if(item.tablenumber==-1){ 
     console.log(item); 
     assigntable(item,1); 
    }  
    callback(); 
    }, function(err) { 
    console.log('iterating done'); 
    })}).sort({datesubmitted:1}); 
+0

Ich habe versucht, aber es funktioniert nicht. Der Rückruf in assigntable-Funktion startet erst, nachdem die for-Schleife beendet ist. –

+0

für mehr Kontext verwandt: http://stackoverflow.com/questions/21184340/async-for-loop-in-node-js –

Verwandte Themen