javascript - 关于循环的异步操作

查看:69
本文介绍了javascript - 关于循环的异步操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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

解决方案

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

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 也是可以解决的,因为其返回的结果数组与你的文件顺序是一一对应的。

这篇关于javascript - 关于循环的异步操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆