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

关于循环的异步操作

关于循环的异步操作

千巷猫影 2018-12-21 19:14:48
const fs = require('fs')var readFile = function (fileName) {  return new Promise(function (resolve, reject) {    fs.readFile(fileName, 'utf8', function (error, data) {      if (error) return reject('出错啦' + error);      resolve(data);    });  });};var getData = function() {  var files=['./data1.js', './data2.js', './data3.js']  var result=[];  files.forEach(async (file) => {    var data = await readFile(file);    console.log(data)  // 循环打印出3个文件的内容    result.push(data)  })  console.log(result)  // 打印空数组 []}getData()啊,重新书写问题怎么控制流程打印出已经获取到内容的 result 数组可以的话,麻烦把修改完成后的代码写在答案里这个问题困扰好久orz
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

事件监听下,你的问题应该是在于无法控制异步读的顺序,不知道哪个文件先读完:

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

const fs = require('fs')


var readFile = function (fileName) {

    return new Promise(function (resolve, reject) {

        fs.readFile(fileName, 'utf8', function (error, data) {

            if (error) return reject('出错啦' + error);

            resolve(data);

        });

    });

};



var getData = function() {

    var files=['./data1.js', './data2.js', './data3.js']

    var result=[];


    //打印最终的结果

    myEmitter.on('done', () => {  

        console.log('触发了一个事件!');

        console.log(result)  

    });


    let index = 0;

    myEmitter.on(`index`, () => {  

        (async () => {

            try {

                var data = await readFile(files[index]);

                console.log(data);  // 循环打印出3个文件的内容

                result.push(data);

                if (index == (files.length - 1)) { //操作完毕,触发结束事件

                    myEmitter.emit('done');

                } else {

                    index++;

                    myEmitter.emit(`index`);

                } 

            } catch (error) {

                console.log(error);

            }

        })();

    });

    myEmitter.emit(`index`);

    

}


getData()

另外 promise.all 也是可以解决的,因为其返回的结果数组与你的文件顺序是一一对应的。

查看完整回答
反对 回复 2019-01-16
  • 1 回答
  • 0 关注
  • 439 浏览
慕课专栏
更多

添加回答

举报

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