Mongoose 如何将变量从.map()传递到回调函数

Mongoose 如何将变量从.map()传递到回调函数,mongoose,callback,promise,field,Mongoose,Callback,Promise,Field,我有一个将所有相关员工返回到项目中的功能。 这是我返回员工列表的代码的一部分,但在我获得员工信息后,我需要在对象中添加额外的字段,然后返回它 ` var involvedEmployees = employeeItems.map(employeeItem => { return new Promise((resolve,reject) => { employeeId = employeeItem.employeeId;

我有一个将所有相关员工返回到项目中的功能。 这是我返回员工列表的代码的一部分,但在我获得员工信息后,我需要在对象中添加额外的字段,然后返回它

`    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和role变量发送到findById回调函数,以便在解析承诺之前添加到对象中。

问题在于您的变量employeeId、whatDid和role是全局变量。假设findById回调将在
map()
方法迭代所有员工后执行,那么在调用这些findById回调时,这三个变量将被设置为最后一个员工的数据

你可以用几种方法来解决这个问题。一种是使用
let
声明三个变量,使它们成为块的局部变量,每个findById回调将引用该特定的变量集

但是为什么不在findById回调中引用employeeItem变量的属性呢?该变量是局部变量,因此具有相同的优势。您可以在该回调中使用
employeeItem.employeeId
,而不会出现问题

与您的问题无关:您不必使用
new promise
创建新承诺,因为使用
exec
方法可以从findById查询中获得承诺:


它适合我,正如您所说,我只需要用let()定义变量。非常感谢你。
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);
});