为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕勒3428872 2019-03-29 22:19:46
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来处理么。。
查看完整描述

3 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

你的问题在于, 你用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);

    }

  });

});


查看完整回答
反对 回复 2019-04-09
?
隔江千里

TA贡献1906条经验 获得超10个赞

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

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


查看完整回答
反对 回复 2019-04-09
?
MM们

TA贡献1886条经验 获得超2个赞

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


查看完整回答
反对 回复 2019-04-09
  • 3 回答
  • 0 关注
  • 639 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信