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

Posted

技术标签:

【中文标题】如何将变量从 .map() 传递给回调函数【英文标题】:How to Pass a variable from .map() to callback function 【发布时间】:2017-10-03 00:42:48 【问题描述】:

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

`    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 和角色变量发送到 findById 回调函数以添加到对象中。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

它对我有用,正如你所说,我只需要用 let :) 定义我的变量。非常感谢。

以上是关于如何将变量从 .map() 传递给回调函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将内部回调的结果传递给其父函数? [复制]

将范围传递给回调函数/绑定

ctypes给扩展模块中的函数传递回调函数

避免 nodeJs 中的回调地狱/将变量传递给内部函数

如何将 C++ 回调传递给 C 库函数?

将回调函数作为道具传递给孩子