我编写以下代码以从文件中读取数据并推入数组。但是attachments.length首先打印为0,然后加载并打印数据。
const fs=require('fs');
const util=require('util');
const files=['t1.csv','t2.csv','t3.csv'];
async getdata(){
const read=util.promisify(fs.readFile);
let attachments = [];
async function run(file){
let data=await read(file);
attachments.push(data);
}
for(let file of files){
await run(file);
}
console.log(attachments.length);//should print 3
}
如何先加载数据然后正确推送。
编辑:更改部分代码以使用await。但是第一次迭代后循环中断而没有给出任何错误,都不会打印出我的attchments.length。
编辑2:问题已解决。调用函数也应该等待。谢谢大家。
答案 0 :(得分:3)
之所以发生这种情况,是因为在这种情况下也应等待run()
,
参见async function
一种方法是使用IIFE:
(async file => {
let data = await read(file);
console.log(data);
attachments.push(data);
})('/home/nadeem/Desktop/test.csv')
答案 1 :(得分:1)
调用async
函数时,它将返回一个诺言,该诺言最终将使用该函数返回的值来解决(或拒绝,并从该函数内部抛出未捕获的异常)。
因此,您正在尝试记录run ()
函数完成之前的附件数量。这就是您需要的:
run('/home/nadeem/Desktop/test.csv')
.then(() => console.log(attachments.length))