我有许多函数可以在循环中为不同的数据执行几次异步函数。我要等到所有异步功能将被执行,然后解析(),(或称非承诺函数回调函数):等待很多异步函数执行
var readFiles =()=>{
return new Promise((resolve,reject)=>{
var iterator = 0;
var contents = {};
for(let i in this.files){
iterator++;
let p = path.resolve(this.componentPath,this.files[i]);
fs.readFile(p,{encoding:'utf8'},(err,data)=>{
if(err){
reject(`Could not read ${this.files[i]} file.`);
} else {
contents[this.files[i]] = data;
iterator--;
if(!iterator) resolve(contents);
}
});
}
if(!iterator) resolve(contents); //in case of !this.files.length
});
};
我增加iterator
在每个循环重复,那么,在异步函数的回调降低iterator
并检查是否所有的异步函数都已完成(迭代器=== 0),如果是这样 - 请致电resolve()
。
它很好用,但看起来不够优雅和可读。你知道这个问题有更好的办法吗?
[Promise.all()](HTTPS://developer.mozilla。 org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)将非常合适!而不是一个大的承诺,将个体较小的承诺推向一个数组。然后,使用'承诺。all()'等待所有的承诺解决。 – dpaulus
我不知道这个功能,谢谢! –
请注意,你正在做的是解决这个问题的正确方法;你的编码器本能就是关键。 'Promise.all'将简单地为你做好准备,保持你的代码清洁。另外 - 你可能想使用'fs-extra',一个替代'fs'的插件,但是增加了promise的支持。 – Amadan