关于循环的异步操作

图片描述

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

阅读 2.3k
2 个回答

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

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

不应该是new = await 异步操作获取到新数据; 这样吗?

let datas = [data1, data2, data3, ...]
let tasks = []
datas.forEach((old) => {
    tasks.push(Promise<old>)
})
Promise.all(tasks).then(arr => {
    // arr
})

把数据插入别的js文件?

如果两个文件跑的是同一个进程的话,存到内存里,去读就行咯。不在同一个进程,可以考虑进程间通信,也可以存到redis里

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题