将附加参数传递给回调函数

时间:2014-12-08 18:54:30

标签: javascript node.js callback

我觉得我必须遗漏一些明显的东西,但我似乎无法找到它。

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

fs = require('fs');

for(var i = 0; i < 5; i++){
    fs.readFile(filePath, function(err, data){
        console.log(i);
    });
}
这样做你通常会把一堆4写在屏幕上。我理解为什么会这样。它正在发生,因为这是&#39; i&#39;当它到达所有回调代码的那一部分时。这不起作用:

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);
}

as&#39; err&#39;和&#39;数据&#39;未定义。我也理解为什么会这样。

这适用于&#39; i&#39;但后来我失去了我需要的错误和数据值。

fs = require('fs');

for(var i = 0; i < 5; i++){
    fs.readFile(filePath, callback(i))
}

function callback(num){
    console.log(num);
}

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

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

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操作。

答案 1 :(得分:2)

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

fs = require('fs');

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

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