Javascript无法推送到函数

时间:2016-12-22 02:35:02

标签: javascript arrays scope

我有一个充满json文件的文件夹,我正在尝试将它们全部推送到数组中。但是,外部数组是空白的。任何关于为什么会发生这种情况或解释更好的方法的帮助将不胜感激。

var fs = require('fs');
var dataFolder = './jsonData/';

var arr = [];
fs.readdir(dataFolder, (err, files) => {
    files.forEach(file => {
        fs.readFile(dataFolder + file, 'utf8', function (err, data) {
            if (err) throw err;
            arr.push(data);
            console.log (arr); // correct output
        })
    })
})
console.log (arr);  //output is []

对不起它看起来多么丑陋,但这里是内部数组的一些输出:

['{\ n“title”:“一种新的科学[精装]”,\ n“作者”:“Stephen Wolfram”,\ n“价格”:“$ 20.73”,\ n“shippingWeight”: “5.6磅”,\ n“isbn10”:“1579550088”\ n}']

['{\ n“title”:“一种新的科学[精装]”,\ n“作者”:“Stephen Wolfram”,\ n“价格”:“$ 20.73”,\ n“shippingWeight”: “5.6磅”,\ n“isbn10”:“1579550088”\ n}',   '{\ n“标题”:“我戴着黑帽子:与恶棍一起挣扎(真实和想象)[精装]”,\ n“作者”:“查克克洛斯特曼”,\ n“价格”:“15.49美元”, n“shippingWeight”:“2.2磅”,\ n“isbn10”:“1439184496”\ n}']

1 个答案:

答案 0 :(得分:2)

readdir是异步的,在您到达console.log时尚未执行。

  1. var arr = []; - 将arr设置为空数组。
  2. fs.readdir(....)去读取后台的目录并安排在readdir后台作业完成后执行回调此文件已完成激活。
  3. console.log(arr);打印现在的arr(空)。
  4. readdir完成并且调用堆栈上没有其他内容,所以现在我们终于可以执行回调了。
  5. 开始推送到arr
  6. console.log(arr);打印现在的arr(最终填充)。
  7. 全球国家也是一个混乱和错误的来源。尝试设计代码,使其不依赖于全局状态。 (https://softwareengineering.stackexchange.com/a/148109/16887