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
事件中,该事件将在文件读取完成时发生。