将其他参数传递到回调函数中

Passing Additional Arguments into a Callback Function

本文关键字:函数 回调 其他 参数传递      更新时间:2023-09-26

我觉得我一定错过了一些明显的东西,但我似乎找不到它。

在 nodejs 中,如何将其他参数传递到回调函数中?

fs = require('fs');
for(var i = 0; i < 5; i++){
    fs.readFile(filePath, function(err, data){
        console.log(i);
    });
}

这样做,你通常会在屏幕上写一堆4。我理解为什么会这样。它之所以发生,是因为当它到达所有回调的代码部分时,这就是"i"的值。这也不起作用:

fs = require('fs');
for(var i = 0; i < 5; i++){
    fs.readFile(filePath, callback(err, data, i));
}
function callback(err, data, i){
    console.log(i);
}

因为"错误"和"数据"未定义。我也理解为什么会这样。

这适用于"i",但随后我丢失了所需的错误和数据值。

fs = require('fs');
for(var i = 0; i < 5; i++){
    fs.readFile(filePath, callback(i))
}
function callback(num){
    console.log(num);
}

我该如何解决这个问题?

尝试将其包装在自执行的匿名函数中:

fs = require('fs');
for(var i = 0; i < 5; i++){
    (function(i) {
        fs.readFile(filePath, function(err, data){
            console.log(i);
        });
    })(i)
}

另外,请记住,此方法无法扩展。例如,如果您尝试将 for 循环设置为 1000,它将尝试同时进行所有 1000 次 readFile 调用。最好使用异步库之类的东西来确保不会同时运行太多 IO 操作。

最简单的方法是使用立即调用的函数表达式 (IIFE):

fs = require('fs');
for(var i = 0; i < 5; i++){
    (function(i){
        fs.readFile(filePath, function(err, data){
            console.log(i);
        });
    })(i);
}

这会在匿名闭包内的每次迭代中"捕获"i的值。