我有一系列图像可以通过一系列异步操作上传,如下所示:
for ( var key in imageFileObject ) {
const imageFile = imageFileObject[key]
dispatch('get_signed_request', imageFile)
}
每个dispatch
都会触发大量其他异步操作。
我想知道所有操作何时完成,以便我可以采取一些行动。
如何实现这一目标?
答案 0 :(得分:2)
试试这个:
let totalImagesLeft = Object.keys(imageFileObject).length;
for ( var key in imageFileObject ) {
const imageFile = imageFileObject[key]
dispatch('get_signed_request', imageFile).then((res)=>{
totalImagesLeft --;
if(totalImagesLeft === 0){
// done
}
});
}
您可以粘贴到显示其工作的控制台的示例:
var async = () => {
return new Promise((resolve,reject)=>{
setTimeout(()=>{ console.log("done"); resolve() },1000);
});
}
let test = [async,async,async];
let totalImagesLeft = test.length;
for ( let t of test ) {
t().then((res)=>{
totalImagesLeft --;
if(totalImagesLeft === 0){
console.log("finished");
}
});
}
答案 1 :(得分:1)
如果imageFileArray
是一个数组,并且dispatch
返回一个承诺,那么就这样做:
Promise.all(imageFileArray.map(file => dispatch('get_signed_request', file)))
.then(results => console.log("finished"));
答案 2 :(得分:1)
您可以使用 Promisse.all ,它会返回一个承诺,该承诺会在迭代参数中的所有承诺都已解决时解析,或者拒绝首先传递的拒绝承诺的原因。< / p>
Mozilla文档here。
Promise
.all(fileArray.map(file => dispatch('get_signed_request', file)))
.then(data => console.log("All your async operations are finished"));