我正在使用以下格式的库函数:
let arr = [1,2,3]
arr.forEach((item, i) =>{
doSomething(inputParam, (err, result)=>{
...
//Use err and result
});
})
err
和result
是在我没有开发的库函数中设置的。
如何将额外的参数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/