2017-05-04 5 views
0

Ich habe eine Funktion, um alle beteiligten Mitarbeiter in ein Projekt zurückzugeben. Hier ist ein Teil meines Codes, um die Liste der Mitarbeiter zurück zu geben, aber nachdem ich die Mitarbeiterinformationen erhalten habe, muss ich ein zusätzliches Feld in das Objekt einfügen und es danach zurückgeben.Wie übergebe ich eine Variable von .map() zu Callback-Funktion

` var involvedEmployees = employeeItems.map(employeeItem => { 
      return new Promise((resolve,reject) => { 

       employeeId = employeeItem.employeeId; 
       whatDid = employeeItem.whatDid;      
       role = employeeItem.role; 

       employeeModel.findById(employeeId, function(err, findedEmployee){ 
        findedEmployee = findedEmployee.toObject(); 
        findedEmployee["NewField"] = Variable; //this Variable need to come from .map function 
        resolve(findedEmployee); 
       }); 
      });         
     }); 
     var results = Promise.all(involvedEmployees); 
     results.then(data => { 
      res.json(data); 
     }); 
` 

Bitte sagen Sie mir, wie kann ich whatDid und Rolle varables zu findById Callback-Funktion hinzuzufügen, in Objekt vor löse das Versprechen senden.

Antwort

0

Das Problem ist, dass Ihre Variablen employeeId, whatDid, und Rolle globale Variablen sind. Da die findById Rückrufe ausgeführt wird nach die map() Methode alle Mitarbeiter durchlaufen wurde, werden diese drei Variablen werden diese durch die Zeit, die letzten Mitarbeiters Daten eingestellt werden findById Rückrufe aufgerufen werden.

Sie können dies auf verschiedene Arten lösen. Eine besteht darin, Ihre drei Variablen mit let zu deklarieren, damit sie für den Block lokal werden, und jeder findById Rückruf wird diese spezifische Gruppe von Variablen referenzieren.

Aber warum verweisen nicht nur die Eigenschaften des employeeItem Variable innerhalb die findById Rückruf? Diese Variable ist lokal, also haben Sie die gleichen Vorteile. Sie können employeeItem.employeeId in diesem Rückruf ohne Problem verwenden.

Nicht zu Ihrer Frage: Sie sollten ein neues Versprechen mit new Promise, da mit der exec Methode nicht erstellen müssen Sie ein Versprechen aus der findById Abfrage erhalten:

var involvedEmployees = employeeItems.map(employeeItem => 
    employeeModel.findById(employeeId, (err, foundEmployee) => { 
     foundEmployee = foundEmployee.toObject(); 
     foundEmployee.employeeId = employeeItem.employeeId; 
     foundEmployee.whatDid = employeeItem.whatDid; 
     foundEmployee.role = employeeItem.role; 
    }).exec() // make it a promise 
); 
var results = Promise.all(involvedEmployees); 
results.then(data => { 
    res.json(data); 
}); 
+0

es für mich arbeiten, Wie du gesagt hast, muss ich nur meine Variablen mit Let definieren :). vielen Dank. –

Verwandte Themen