Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript array.length为零,但数组中包含元素_Javascript_Arrays_Scope_Electron - Fatal编程技术网

Javascript array.length为零,但数组中包含元素

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

我目前正在练习使用electron,但我对javascript非常陌生,遇到了一个让我完全困惑的问题。我有以下代码:

    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?@Taira
readdir
只需在读取完成时重新设置要调用的回调,然后继续执行下一条语句并执行它(与
setTimeout发生的情况几乎相同)
!如果您想要同步版本,请使用
readdirSync
(但我不推荐)。好的,这很有意义!我有Python的背景,所以这种类型的东西对我来说很陌生。还有一个问题:出于好奇,为什么不推荐
readdirSync