为什么在FS中没有等待

时间:2019-08-21 05:51:28

标签: node.js

我试图解析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,但是我认为这不是正确的方法。

我在这里想念什么?等待不应该在此特定功能中工作?

非常感谢您的回答!谢谢!

1 个答案:

答案 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仅适用于调用它的上下文。基本上,您的代码会看到“异步”功能-它已经将其标记为异步并将其发送到事件循环。因此,“等待”仅会在其找到的函数中阻止执行,但主代码仍将运行。这就是为什么您必须在同一异步函数中进行与“已等待”功能相关的数据转换的原因。