- var fs = require(‘fs‘);
- var files = [‘a.txt‘, ‘b.txt‘, ‘c.txt‘];
- for (var i = 0; i < files.length; i++) {
- fs.readFile(files[i], ‘utf-8‘, function (err, contents) {
- console.log(files[i] + ‘: ‘ + contents);
- });
- }
这段代码的功能很直观,就是依次读取文件 a.txt、b.txt 、c.txt ,并输出文件名和内容。假设这三个文件的内容分别是 AAA 、BBB 和 CCC,那么我们期望的输出结果就是:
- var fs = require(‘fs‘);
- var files = [‘a.txt‘, ‘b.txt‘, ‘c.txt‘];
- for (var i = 0; i < files.length; i++) {
- fs.readFile(files[i], ‘utf-8‘, function (err, contents) {
- console.log(files);
- console.log(i);
- console.log(files[i]);
- });
- }
现在问题就明朗了:原因是3 次读取文件的回调函数事实上是同一个实例,其中引用到的 i 值是上面循环执行结束后的值,因此不能分辨。如何解决这个问题呢?我们可以利用
- var fs = require(‘fs‘);
- var files = [‘a.txt‘, ‘b.txt‘, ‘c.txt‘];
- for (var i = 0; i < files.length; i++) {
- (function (i) {
- fs.readFile(files[i], ‘utf-8‘, function (err, contents) {
- console.log(files[i] + ‘: ‘ + contents);
- });
- })(i);
- }
补充:闭包的写法,无法保证按数组存放文件顺序读取文件内容,相当多个文件读取操作并行进行,根据文件大小决定读取的快慢;而forEach是可以的保证顺序读取;
事实上以上这种写法并不常见,因为它降低了程序的可读性,故不推荐使用。大多数情况下我们可以用数组的 forEach 方法解决这个问题:
- var fs = require(‘fs‘);
- var files = [‘a.txt‘, ‘b.txt‘, ‘c.txt‘];
- files.forEach(function (filename) {
- fs.readFile(filename, ‘utf-8‘, function (err, contents) {
- console.log(filename + ‘: ‘ + contents);
- });
- });
时间: 2024-10-11 23:10:10