我正在尝试解析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()
,等等。
但是,它不会让apiCall
完成并读取CSV文件中的下一个数据。所以,最后,它只返回未定义的updatedBook
。
如果我睡眠10秒并等待所有apiCall完成,它会返回正确的updatedBook
,但我不认为这是正确的方法。
这里我漏掉了什么?await不应该在这个特定函数中工作吗?
您的回答将非常感谢!谢谢!!
发布于 2019-08-21 06:38:16
只需“等到”读取csv文件完成,尝试捕获“finish”事件,然后将所有事件包装到一个Promise中,在Promise中,我们更新call 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
仅适用于调用它的上下文。基本上,你的代码看到了"async“函数-它已经将它标记为异步,并将其发送到事件循环。因此,"await“只会在找到它的函数中阻塞执行,但主代码仍然会运行。这就是为什么你必须在同一个异步函数中进行与“等待”功能相关的数据转换。
https://stackoverflow.com/questions/57585204
复制相似问题