数组中奇怪的行为

时间:2017-01-31 18:25:38

标签: javascript arrays node.js

在NodeJS中,我试图以递归方式读取目录及其子目录中的文件

export const readDirRecursively = (rootDir) => {
  const files = [];

  return new Promise((resolve, reject) => {
    // Inner function for recursive operation
    function innerFun(dir) {
      fs.readdir(dir, (err, xpaths) => {
        if (err) reject(err);

        for (let xpath of xpaths) {
          const absPath = path.join(dir, xpath);
          if (fs.statSync(absPath).isDirectory()) {
            innerFun(absPath);
          } else {
            files.push(absPath);
          }
        }
      });
    }

    innerFun(rootDir);  // Call innerFun to initate
    console.log(files);   // contains vaules as expected
    console.log([...files]);  // empty array
    console.log(files.map(file => file + ' test')); // empty array

    const testVar = [1,2,3,4];
    console.log([...testVar]);    // This log [1,2,3,4] as expected

    resolve(files);
  });

};

我发现这个阵列的异常行为。在调用递归函数后,数组files包含预期的项。但是当我尝试map或使用rest / spread运算符复制或迭代它时,该数组变为空。

为了确保,我尝试使用[1,2,3,4]进行同样的操作。有了它,一切都按预期工作。但是,只有files数组才会显示这种异常行为。

1 个答案:

答案 0 :(得分:2)

当您记录数组时,您是否在之后在控制台中将其展开?

您已经记录了一个数组。不是一个值,而是一个对象。因此,当您查看它时,它会显示您查看时的值。但是当你执行[...files]时,那个新数组是根据旧数组的值构建的(现在还没有),这个新数组不会被异步修改函数,所以你只看到那个空数组。

files.map(...)相同,因为它也会返回一个没有值的新数组。

最后testVar在您记录它的时间与您在控制台中查看展开对象的时间之间不会发生变化。

调试对象时,请考虑使用console.log(JSON.stringify(files))来获取"快照"它的。