Javascript 无法推送到函数内部的全局数组

标签 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": "A New Kind of Science [Hardcover]",\n "author": "Stephen Wolfram",\n "price": "$20.73",\n "shippingWeight": "5.6 磅",\n "isbn10": "1579550088"\n}' ]

[ '{\n "title": "A New Kind of Science [Hardcover]",\n "author": "Stephen Wolfram",\n "price": "$20.73",\n "shippingWeight": "5.6 磅",\n "isbn10": "1579550088"\n}', '{\n "title": "I Wear the Black Hat: Grapping with Villains (Real and Imagined) [Hardcover]",\n "author": "Chuck Klosterman",\n "price": "$15.49",\n "shippingWeight": "2.2 磅",\n "isbn10": "1439184496"\n}' ]

最佳答案

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(最终填充)。

全局状态也是许多困惑和错误的来源。尝试设计您的代码,使其不依赖于全局状态。 ( https://softwareengineering.stackexchange.com/a/148109/16887 )

关于Javascript 无法推送到函数内部的全局数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41274983/

相关文章:

c - 初始化中的指针目标的符号不同

python-3.x - python 本地函数中未解析的引用

javascript - 如何用jquery打印特殊字符?

javascript - 当我删除父元素本身时,是否需要删除 DOM 元素的所有子元素?

java - 为什么这不起作用?比较两个二维数组中的元素

c++ - 将结构指针传递给函数 C++

arrays - Powershell 范围 : variable array within loop not populating when adding to second array

c# - Lambda 范围说明

javascript - 如果耳机刚拔出,如何在浏览器中检查?

javascript - 显示一些错误 Uncaught ReferenceError :