猿问

关于循环的异步操作


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

千巷猫影
浏览 440回答 1
1回答

繁星淼淼

事件监听下,你的问题应该是在于无法控制异步读的顺序,不知道哪个文件先读完: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 也是可以解决的,因为其返回的结果数组与你的文件顺序是一一对应的。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答