nodejs中怎么循环执行一个异步的方法呢?

发布于 2022-09-07 15:52:50 字数 618 浏览 14 评论 0

perPageFiles = filenames.slice(articleIndex, articleIndex + perPage);
perPageFiles.forEach(function(filename, index) {
  fs.readFile(fileDirectory + filename + '.md', 'utf-8', function(err, data) {
    if (err) throw err;
    perPageDatas[index].articleContent = data.split('<!--more-->')[0];
    if (index === perPageFiles.length - 1) {
      result.count = totalArticles;
      result.data = perPageDatas;
      result.ret = true;
      res.send(result);
    }
  });
});

这个是我程序中的一段代码,目的是利用readFile函数循环读取文件,但是测试发现有时候读取的数据会丢失,查了下资料貌似是因为这个方法是异步的,不能直接这样循环么,这个能用promise或者async来处理么。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

清风疏影 2022-09-14 15:52:50

你的问题在于, 你用index === perPageFiles.length - 1判断任务已经执行完毕, 但这个判断只能说明最后一个发起的readFile已经结束, 因为异步的关系, 最后一个发起的readFile并不一定是最后一个结束的, 这并不能说明所有的readFile已经执行完毕.

可以作如下修改, 用额外的计数器

perPageFiles = filenames.slice(articleIndex, articleIndex + perPage);
let completedCount = 0;
perPageFiles.forEach(function(filename, index) {
  fs.readFile(fileDirectory + filename + '.md', 'utf-8', function(err, data) {
    if (err) throw err;
    perPageDatas[index].articleContent = data.split('<!--more-->')[0];
    completedCount++;
    if (completedCount === perPageFiles.length) {
      result.count = totalArticles;
      result.data = perPageDatas;
      result.ret = true;
      res.send(result);
    }
  });
});
|煩躁 2022-09-14 15:52:50

这个能用promise或者async来处理么

可以,但是本来就提供了同步API的readFileSync

永不分离 2022-09-14 15:52:50

一般来说读取文件最好是使用异步读取,对于题主这个简单的需求来说,不妨将读取文件这一步包装为promise ,遍历需求路径下的所有文件路径,调用之前的包装函数将返回promise都放到一个数组里面,然后在使用promise.all方法同时读取所有的文件。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文