Javascript 对于包含内容的数组,为什么数组长度为零?

Javascript 对于包含内容的数组,为什么数组长度为零?,javascript,arrays,node.js,electron,Javascript,Arrays,Node.js,Electron,这是我的密码: <script type="text/javascript" src="read.js"></script> <script> var beats=[] beats=read('heartRate.txt') console.log(beats) //label 1 console.log(beats.length) //label 2 for (i = 0; i < beats.length

这是我的密码:

<script type="text/javascript" src="read.js"></script>
<script>
  var beats=[]
  beats=read('heartRate.txt')
  console.log(beats)           //label 1
  console.log(beats.length)    //label 2
  for (i = 0; i < beats.length; i++) { 
    console.log(beats[i])
    if(parseInt(beats[i])>80 || parseInt(beats[i])<50){
      document.getElementById('Alert').innerHTML('Abnormal heartrate of '+parseInt(beats[i]))
    }
  }
  console.log(beats)
</script>
标签1:控制台中打印的值显示数组及其内容

标签2:数组的长度显示为0。 有没有办法找到数组的大小

控制台图像附于此处:


我想这是因为read()函数是异步的,需要一些时间才能完成执行。最初,长度打印为零,然后是实际值5。尝试从read()函数返回一个承诺,看看它是如何工作的

 function async read(filename){
    var fs = require('fs');
      var readline = require('readline');
      var stream = require('stream');

      var str =[]
      var instream = fs.createReadStream(filename);
      var outstream = new stream;
      var rl = readline.createInterface(instream, outstream);

      rl.on('line', function(line) {
        //console.log(line+'\n')
        str.push(line)
      });

      rl.on('close', function() {
        // do something on finish here
        console.log(str.length)
      });
      return str;
}


var beats=[]
读取('heartRate.txt')。然后(函数(数据){
节拍=数据
//在这里做你的事
})
不起作用,因为

console.log(beats)           //label 1
console.log(beats.length)  
读取是异步进行的,只有在

rl.on('line', function(line) {
        //console.log(line+'\n')
        str.push(line)
      });

将其添加到关闭(
rl.on(
)。

您应该让
read
返回一个承诺,并且仅在加载完所有数据后使用数据:

函数读取(文件名){
返回新承诺((解决、拒绝)=>{
常数fs=要求(“fs”);
const readable=fs.createReadStream(文件名);
让数据=[];
readable.on('data',chunk=>{
数据推送(块);
});
可读。on('end',()=>{
解析(数据);
});
可读。on('error',err=>{
拒绝(错误);
});
}
}
您可以这样使用它:


读取('heartRate.txt')。
然后(节拍=>{
console.log(beats)//标签1
console.log(beats.length)//标签2
对于(i=0;i80 | | parseInt(beats[i])console.log(`Oh no,发生了一个错误:${err}`));

此读取函数似乎是一个异步函数。您如何同步使用它?出于好奇,您确定
beats.length
未定义的
?Javascript数组必须具有数字长度属性(请参见:)。在您的代码中
读取()
返回一个空数组,该数组可以/将在下一个节拍中填充。这意味着
节拍。长度
应该是
0
,而不是
未定义
!它不是未定义的,它打印为零
console.log(beats)           //label 1
console.log(beats.length)  
rl.on('line', function(line) {
        //console.log(line+'\n')
        str.push(line)
      });