我有許多函數可以在循環中爲不同的數據執行幾次異步函數。我要等到所有異步功能將被執行,然後解析(),(或稱非承諾函數回調函數):等待很多異步函數執行
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