完成所有异步操作后回调

时间:2017-01-27 00:54:58

标签: javascript asynchronous

我有一系列图像可以通过一系列异步操作上传,如下所示:

for ( var key in imageFileObject ) {
  const imageFile = imageFileObject[key]
  dispatch('get_signed_request', imageFile)
}

每个dispatch都会触发大量其他异步操作。

我想知道所有操作何时完成,以便我可以采取一些行动。

如何实现这一目标?

3 个答案:

答案 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"));