2017-05-04 63 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

它为我工作,正如你所说,我只需要定义我的变量,让:)。非常感谢你。 –

相关问题