将附加parameter passing给callback函数

我觉得我一定是错过了一些明显的东西,但我似乎无法find它。

在nodejs中如何传递额外的参数到一个callback函数?

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

这样做,你通常会得到一堆写在屏幕上的4。 我明白为什么会这样。 它正在发生,因为这是“我”的价值,当它到达所有callback的代码的一部分。 这也不起作用:

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

因为“错误”和“数据”是不确定的。 我也明白为什么是这样。

这适用于'我',但然后我失去了我需要的错误和数据值。

 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调用。 你最好使用类似asynchronous库的东西,以确保你没有同时运行太多的IO操作。

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

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

这个“捕获” i在每个迭代内匿名封闭的价值。