【问题标题】:Why is await not waiting in fs为什么await不在fs中等待
【发布时间】:2019-12-26 08:29:08
【问题描述】:

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

我在这里缺少什么? await 不应该在这个特定的功能中工作吗?

您的回答将不胜感激!谢谢!!

【问题讨论】:

  • 能否提供api调用的代码?
  • 您在data 事件开始之前记录updatedBook.. 流式开始异步...
  • callback to handle completion of pipe 和其他一些的可能重复:1234
  • @MatJ 哦,我明白了 - 有没有办法在完成所有 apiCall() 后返回 updatedBook?
  • @jinjineos,请参阅下面的答案或this answer 提供另一种方式..

标签: node.js


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

【讨论】:

  • 我认为现在的问题是 fs 正在读取后续数据,而无需等待 apicall 完成。所以在读取所有数据后,它实际上只会返回空的 updatedBooks,因为到那时还没有处理任何 apiCall。
  • 哦,你是对的。我也会编辑答案,但你应该做的是返回等待的承诺,并使用你想从 yourFunctionName 返回的参数进行解析,例如 updatedBooks。我的编辑应该很快就会被接受,你可以在答案中看到它
  • 但是,请注意await 会导致这个函数也返回一个承诺,所以你也必须在外面等待它
猜你喜欢
  • 2019-10-16
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 2021-06-25
相关资源
最近更新 更多