javascript - 关于循环的异步操作
本文介绍了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屋!
查看全文