首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么await不在fs中等待?

为什么await不在fs中等待?
EN

Stack Overflow用户
提问于 2019-08-21 05:51:29
回答 1查看 339关注 0票数 0

我正在尝试解析csv文件,根据获取的信息,我正在使用它进行api调用。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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不应该在这个特定函数中工作吗?

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

EN

回答 1

Stack Overflow用户

发布于 2019-08-21 06:38:16

只需“等到”读取csv文件完成,尝试捕获“finish”事件,然后将所有事件包装到一个Promise中,在Promise中,我们更新call update books

(您可以使用error事件介绍读取文件错误的情况)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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“只会在找到它的函数中阻塞执行,但主代码仍然会运行。这就是为什么你必须在同一个异步函数中进行与“等待”功能相关的数据转换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57585204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文