Javascript array.length为零,但数组中包含元素
我目前正在练习使用electron,但我对javascript非常陌生,遇到了一个让我完全困惑的问题。我有以下代码:Javascript array.length为零,但数组中包含元素,javascript,arrays,scope,electron,Javascript,Arrays,Scope,Electron,我目前正在练习使用electron,但我对javascript非常陌生,遇到了一个让我完全困惑的问题。我有以下代码: function getPaths() { var dirPath = document.getElementById("mdir").innerHTML; var filePaths = []; fs.readdir(dirPath, function(err, dir) { for(var i = 0, l = di
function getPaths() {
var dirPath = document.getElementById("mdir").innerHTML;
var filePaths = [];
fs.readdir(dirPath, function(err, dir) {
for(var i = 0, l = dir.length; i < l; i++) {
var filePath = dir[i];
filePaths.push(dirPath + "/" + filePath);
}
});
console.log(filePaths);
console.log(filePaths.length);
}
函数getpath(){
var dirPath=document.getElementById(“mdir”).innerHTML;
var filepath=[];
fs.readdir(dirPath,function(err,dir){
for(变量i=0,l=dir.length;i
它应该查找由dirPath
定义的目录,然后循环遍历并获取该目录中所有文件的完整路径。它将它们附加到一个数组中,然后在底部将数组记录到控制台,后跟数组的长度。
让我困惑的是,给定这些代码,数组会像预期的那样记录到控制台,但控制台会记录长度为零。我目前的想法是它与作用域有关,但这没有意义,因为我在运行的函数上方的函数中声明数组,
filepath
。除非我错过了什么。有人能指出我做错了什么吗?readdir
是异步的。它不会马上得到结果。您应该在回调中记录文件路径
。控制台显示该值的唯一原因是,当您展开阵列时,控制台会对其进行求值
按下左侧的小箭头时,将鼠标放在右侧的i
框上。控制台保留了对数组的引用,因此当用户展开数组时,它会显示其当前值。但是当您记录filepath.length
时,数组为空,因为readdir
尚未完成读取,这就是为什么您得到0。但当您打开控制台并按下该箭头时,readdir
已完成读取,控制台将打印阵列的当前值(填充后)
演示问题的示例:(不是解决方案,只是了解实际发生的情况)
尝试运行此代码,看看会发生什么:
var arr = [];
setTimeout(function() {
arr.push(1, 2, 3);
}, 5000);
console.log(arr.length);
console.log(arr);
在这里,在填充数组之前,将记录数组及其长度。5秒后将填充阵列。因此,输出将是0
和一个字符串array[]
。现在,因为阵列可能有大量数据,所以在用户展开阵列之前,控制台不会显示这些数据。因此,控制台所做的是保留对阵列的引用,直到用户按下展开箭头。如果在5秒钟前展开阵列,则会看到阵列为空(尚未填充)。如果你等到5秒钟过去,然后展开它,那么你会看到它被填满了
注意:另外,记录到控制台的行(类似于>Array(0)
)只是日志发生时对象/数组的字符串表示形式。如果对象/数组发生更改,它将不会得到更新。所以有时候这看起来也可能
我希望现在一切都清楚了。为了进一步说明@ibrahim mahrir的答案,他们的意思是这样的
function getPaths() {
var dirPath = document.getElementById("mdir").innerHTML;
var filePaths = [];
fs.readdir(dirPath, function(err, dir) {
for (var i = 0, l = dir.length; i < l; i++) {
var filePath = dir[i];
filePaths.push(dirPath + "/" + filePath);
}
console.log(filePaths);
console.log(filePaths.length);
});
}
函数getpath(){
var dirPath=document.getElementById(“mdir”).innerHTML;
var filepath=[];
fs.readdir(dirPath,function(err,dir){
for(变量i=0,l=dir.length;i
我不建议使用setTimeout
功能,因为响应时间可能会因目录而异content@MaxZoom我没有建议将setTimeout
作为解决方案!我刚刚用一个简单易懂的例子解释了OP的问题,使用setTimeout
强调问题的异步性!好的,如果我做对了,我没有得到一个值的原因是因为readdir是异步的。结果,console.log()在构建阵列之前完成,结果返回0?@Tairareaddir
只需在读取完成时重新设置要调用的回调,然后继续执行下一条语句并执行它(与setTimeout发生的情况几乎相同)
!如果您想要同步版本,请使用readdirSync
(但我不推荐)。好的,这很有意义!我有Python的背景,所以这种类型的东西对我来说很陌生。还有一个问题:出于好奇,为什么不推荐readdirSync
?