Node.js 使用异步/等待逐个读取文件

Node.js 使用异步/等待逐个读取文件,node.js,Node.js,代码如下: function readfile(file) { var readline = require('readline'); var fs = require('fs'); var fReadAD = fs.createReadStream(file,{ encoding: 'utf8'}); var objReadlineAD = readline.createInterface({ input: fReadAD }); objRead

代码如下:

function readfile(file) {
   var readline = require('readline');
   var fs = require('fs');
   var fReadAD = fs.createReadStream(file,{ encoding: 'utf8'});
   var objReadlineAD = readline.createInterface({
      input: fReadAD
   });
   objReadlineAD.on('close', (line)=>{
      return new Promise(function(){
          console.log('file:'+file)
      });
   });
}
(async () => {
   await readfile('./import/1.xls')
   await readfile('./import/2.csv')
})();
为什么输出是

file:./import/2.csv
file:./import/1.xls
我想应该是这样

file:./import/1.xls
file:./import/2.csv

我在async中使用了wait。谁能告诉我怎么了?谢谢

您的
返回新承诺()
不是从
readFile()返回的。由于node.js中的异步操作是非阻塞的,
readfile()
函数会立即返回(没有返回值),然后文件事件会在稍后某个时间发生(在函数已经返回之后)。因此,您的
readFile()
函数不返回任何内容,因此wait不能保证实际等待

这表明您需要一些关于node.js中异步事件和操作如何工作的基础教育/阅读

您的
return new Promise()
刚刚返回到readLine库文件系统事件处理代码中,并且被忽略,因此它没有任何用处。事实上,它并没有返回给任何寻求承诺的人

因此,由于您实际上没有返回任何内容,也没有等待任何内容,因此您的两个异步操作并行进行,不确定哪一个先完成。这可能取决于每个
readFile()
需要多长时间的细节,而这只是一场比赛,看谁先完成。你没有控制他们的执行顺序

事件顺序如下:

  • 首先启动
    readFile()
    操作。它不返回任何返回值,其中的文件操作将作为异步代码/事件进行
  • 等待未定义的
    ,它不等待任何东西
  • 启动第二个
    readFile()
    操作。它不返回任何返回值,其中的文件操作将作为异步代码/事件进行
  • 等待未定义的
    ,它不等待任何东西
  • 两个
    readFile()
    操作中的一个生成关闭事件(以先完成的为准)
  • 另一个
    readFile()
    操作生成其关闭事件
  • 您可以让
    readFile()
    实际返回一个承诺,该承诺在完成时连接到该承诺,然后您可以
    像这样等待它:

    const fs = require('fs');
    const readline = require('readline');
    
    function readfile(file) {
       return new Promise(function(resolve, reject) {
           var fReadAD = fs.createReadStream(file,{ encoding: 'utf8'});
           var objReadlineAD = readline.createInterface({
              input: fReadAD
           });
           objReadlineAD.on('close', () => {
               console.log('file:'+file)
               resolve();
           }).on('error', reject);
       });
    }
    
    (async () => {
       await readfile('./import/1.xls')
       await readfile('./import/2.csv')
    })();
    

    您的
    return new Promise()
    不是从
    readFile()返回的。当
    close
    事件发生时,该函数早已返回。因此,您的
    readFile()
    函数不返回任何内容,因此
    wait
    不保证实际等待。这表明您需要一些关于node.js中异步事件和操作如何工作的基础教育/阅读。请参阅以获取指导。因为您实际上并没有等待任何东西,所以您的两个异步操作并行进行,并且不确定哪一个先完成。
    等待
    等待承诺
    readfile
    不返回任何承诺。因此,它将执行该函数。您拥有的
    console.log
    close
    事件中,该事件将在文件读取完成时发生。