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

时间:2017-05-04 17:47:45

标签: mongoose callback promise field

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

select t.*
from t
where t.timestamp < (select min(t2.timestamp) from t t2 where t2.val is null)
order by t.timestamp desc
limit 1;

请告诉我如何在解决承诺之前将whatDid和角色变量发送到findById回调函数添加到对象中。

1 个答案:

答案 0 :(得分:0)

问题是您的变量 employeeId,whatDid,角色是全局变量。鉴于 findById 回调将在 之后执行 map()方法迭代所有员工,这三个变量将被设置为最后一个员工的数据 findById 调用回调。

您可以通过多种方式解决此问题。一种是用let声明你的三个变量,因此它们成为块的本地变量,每个 findById 回调将引用该特定变量集。

但为什么不在 findById 回调中引用 employeeItem 变量里面的属性? findById 回调?该变量是本地变量,因此您将拥有相同的优势。您可以毫无问题地在回调中使用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);
});