我试图解析csv文件,并且根据获取的信息,我正在对其进行api调用。
代码如下:
let booklist = [];
let updatedBook;
fs.createReadStream("Book1.csv")
.pipe(csv())
.on('data', async function(data){
console.log("data");
updatedBook = await apiCall(data.title, data.author, booklist);
})
console.log(updatedBook);
return updatedBook;
此处的预期行为是打印data
,执行apiCall()
函数,获取CSV
文件中的下一个数据,打印data
,执行apiCall()
等上。
但是,await
不能apiCall
完成,而是要读取CSV文件中的下一个数据。因此,最后,它只返回未定义的updatedBook
。
如果我睡眠10秒钟并等待所有apiCall完成,它将返回正确的updatedBook
,但是我认为这不是正确的方法。
我在这里想念什么?等待不应该在此特定功能中工作?
非常感谢您的回答!谢谢!
答案 0 :(得分:1)
只需“等到”读取csv文件完成,尝试捕获“ finish”事件,然后将所有事件包装到Promise中,在Promise中,我们将调用update books
更新。
(您可以通过error
事件了解读取文件错误的情况)
const yourFunctionName = async () => {
let booklist = [];
let updatedBooks = []; // I think you have too many books to update.
await new Promise((resolve) => {
fs.createReadStream("Book1.csv")
.pipe(csv())
.on('data', async function (data) {
console.log("data");
const updatedBook = await apiCall(data.title, data.author, booklist);
updatedBooks.push(updatedBook); //
})
.on('finish', () => { // fires when no more data will be provided.
resolve(); // I'm done, go to `console.log(updatedBooks);`
});
});
console.log(updatedBooks);
return updatedBooks;
}
至于为什么发生这种情况:await
在异步功能中起作用。这意味着await
仅适用于调用它的上下文。基本上,您的代码会看到“异步”功能-它已经将其标记为异步并将其发送到事件循环。因此,“等待”仅会在其找到的函数中阻止执行,但主代码仍将运行。这就是为什么您必须在同一异步函数中进行与“已等待”功能相关的数据转换的原因。