为什么我不能将对象从node.js中的回调函数推送到数组中?

时间:2016-09-28 13:27:24

标签: javascript arrays node.js

我正在尝试使用“learnyounode”来学习node.js.有一个练习,其中一个应该采用文件夹路径和文件扩展名类型作为输入,然后在该文件夹中将该类型的所有文件作为输出。我构建了这个程序:

var fs = require('fs');
var pathModule = require('path');
var path = process.argv[2];
var ext = '.'.concat(process.argv[3]);
filteredList = [];
fs.readdir(path,function doneReading(err, list){
    for(var i = 0; i < list.length; i++){
        if(pathModule.extname(list[i]) == ext){
            filteredList.push(list[i]);
        }
    }
    })

for(var i = 0; i < filteredList.length; i++){
    console.log(filteredList[i]);
}

由于某种原因

filteredList.push(list[i]);

对filteredList的内容没有影响。为什么是这样?我已经通过将console.log移动到readdir函数内来解决了这个问题,但是我不知道为什么psuh不起作用。

1 个答案:

答案 0 :(得分:1)

函数doneReading确实会影响filteredList,只是你没有等待它。 fs.readdir函数是异步的,它需要回调。当调用它们的方法完成其工作时,将调用回调。回调不会阻止程序执行,从而将列表打印为null。尝试将代码更改为:

fs.readdir(path,function doneReading(err, list){
    for(var i = 0; i < list.length; i++){
        if(pathModule.extname(list[i]) == ext){
            filteredList.push(list[i]);
        }
    }
    for(var i = 0; i < filteredList.length; i++){
        console.log(filteredList[i]);
    }
})