首页 > node.js中异步导致的循环问题

node.js中异步导致的循环问题

//forloop.js

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

为何输出结果为:
undefined: AAA
undefined: BBB
undefined: CCC

改写成forEach
//callbackforeach.js

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

这样结果又对了。。。这是为什么


forEach里是个function 里面filename是闭包变量 所以不会变

var fs = require('fs');
var files = ['a.txt', 'b.txt', 'c.txt'];
for (var i = 0; i < files.length; i++) {
    var fun = function (fileName) {
        fs.readFile(fileName, 'utf-8', function (err, contents) {
            console.log(fileName + ': ' + contents);
        });
    }
    fun(files[i]);
}

这个跟js的语法有关,第一个出错,是由于for循环结束之后,fs.readFile的回调函数才会触发,这个时候i==files.length,但是files[files.length]为undefined(对于异步的一些概念可以参考我的文章,js异步解惑)。
第二个正确是由于对于每个forEach循环来说,fs.readFile都是在forEach内部的闭包函数内运行的,对于每个闭包函数来说filename都是闭包内部变量,不相互影响。

【热门文章】
【热门文章】