2017-05-04 151 views
0

我有一個函數可以將所有涉及到的員工返回到一個項目中。 這裏是我的代碼返回員工列表的一部分,但我得到員工信息後,我需要添加額外的字段到對象,然後返回它。如何將變量從.map()傳遞給回調函數

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

請告訴我,我怎麼能發送whatDid和作用varables到findById回調函數添加到對象之前解決的承諾。

回答

0

的問題是,你的變量僱員,whatDid,作用是全局變量。鑑於findById回調將被執行map()方法迭代所有員工,這三個變量將被這些findById回調被調用的時間設置爲最後一個員工的數據。

你可以用幾種方法解決這個問題。一個是用let聲明你的三個變量,所以它們成爲本地塊,並且每個回調將引用該特定的一組變量。

但是,爲什麼不只是參考裏面的findById回調employeeItem變量的屬性?這個變量是本地的,所以你會有相同的優勢。您可以在該回調中毫無問題地使用employeeItem.employeeId

不相關的問題:你不應該創建一個新的承諾與new Promise,因爲與exec方法,你可以從findById查詢一個承諾:

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

它爲我工作,正如你所說,我只需要定義我的變量,讓:)。非常感謝你。 –