javascript - 将额外参数传递给返回回调

标签 javascript node.js

我正在使用以下格式的库函数:

let arr = [1,2,3]
arr.forEach((item, i) =>{
    doSomething(inputParam, (err, result)=>{
        ...
        //Use err and result
    });

})

errresult是在我没有开发的库函数中设置的。

如何将额外的参数i传递给回调函数?

注意:我希望每个回调中的 i 对应于正确的索引。由于它们是异步的,因此当完成时,它们都会看到 i 的最后一个值,这不是我想要的。例如,第二个回调应看到 i=2,第三个回调应看到 i=3。

我需要这样的东西:

let arr = [1,2,3]
arr.forEach((item, i) =>{
    doSomething(inputParam, (err, result, i)=>{
        ...
        //Use err and result
        console.log("i: ", i);
    });

})

最佳答案

您无法控制回调的参数。这些是由调用者设置的,这是 doSomething() 函数的内部,你说这不是你控制的东西。因此,不要尝试在那里添加调用者未设置的内容。那只会让你陷入困境。

相反,由于您使用的是内联回调,因此您可以直接访问父作用域中的变量,而无需将它们定义为回调的参数。这是 Javascript 的一个很好的功能(可以访问父作用域变量的内联回调)。

这是一个可运行的示例:

let arr = [1, 2, 3];
let inputParam = "something";

arr.forEach((item, i) => {
    doSomething(inputParam, (err, result) => {
        // you can access variables such as i in the parent scope here
        // from an inline callback

        //Use err and result
        console.log("i: ", i);
    });
});

function doSomething(param1, callback) {
    // simulate async callback
    setTimeout(function() {
        callback(null, "hello");
    }, 100);
}

<小时/>

如果您需要使用非内联的回调(例如在另一个模块中定义的回调),您可以创建一个小的内联回调 stub ,然后它可以访问父作用域变量,然后可以使用以下命令调用外部定义的函数所需参数。

let arr = [1, 2, 3];
let inputParam = "something";

function yourExternalFunction(err, result, i) {
    // Use err and result and i
    console.log("i: ", i);
}

arr.forEach((item, i) => {
    doSomething(inputParam, (err, result) => {
        // you can access variables such as i in the parent scope here
        // from an inline callback
        yourExternalFunction(err, result, i) ;
    });
});

function doSomething(param1, callback) {
    // simulate async callback
    setTimeout(function() {
        callback(null, "hello");
    }, 100);
}

关于javascript - 将额外参数传递给返回回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51413397/

相关文章:

javascript - 云函数: HTTP trigger inconsistent batch commit

node.js - 为什么使用不同文件的 Express 路由不起作用?

javascript - 没有再生器的 babel-plugin-transform-async-to-module-method

用于 IE 的 Javascript textContent(保留空格的 innerText)

javascript - Atom 或 VS Code 等文本编辑器中使用的基本组件是什么?

javascript - NodeJS 应用仅返回 Socket.io 欢迎消息

node.js - 我可以覆盖 Express 中的路线吗?

node.js - process.argv 在 Node.js 中未定义

javascript - 如何防止符号 "&"被 "&amp;"替换

javascript - 我无法使用此JS代码播放音频。语法正确,但是吗?