javascript - node.js中异步导致的循环问题
PHP中文网
PHP中文网 2017-04-10 15:38:16
[JavaScript讨论组]

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

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

PHP中文网
PHP中文网

认证0级讲师

全部回复(2)
黄舟

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]);
}
PHP中文网

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号