将附加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
在每个迭代内匿名封闭的价值。