2017-01-27 12 views
1

が完了した後、私はそうのような非同期動作の連鎖でアップロード取得画像の配列を有します。コールバックすべての非同期操作

私は何らかの処置をとることができるように、すべての操作がいつ完了したかを知りたいと思います。

これはどのように達成できますか?

+0

がそれを行う方法のアイデアのためにこれを見て:http://stackoverflow.com/questions/4631774/coordinating-parallel-execution-in-node-js/4631909# 4631909。基本的には、開始した数と完了した数を追跡する必要があります。次に、ロジックを書くのではなく、async.jsライブラリをチェックアウトしてください。 – slebetman

+1

'imageFileObject'が配列の場合、forの代わりに' for 'を使うべきです。 – jib

+0

@jibなぜですか?このケースの違いは何ですか? – softcode

答えて

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

imageFileArrayが配列され、かつdispatchは約束を返す場合、単に実行します。

Promise.all(imageFileArray.map(file => dispatch('get_signed_request', file))) 
    .then(results => console.log("finished")); 
+0

'console.log(" finished ")'は、他の多くのコードがディスパッチされる前に実行されます。 – softcode

+0

@softcodeすべての約束を返すわけではありません。上記のコードでは、returnは暗黙の矢印関数であることに注意してください。したがって、通常の関数を使用している場合は、すべてを明示的に返すようにしてください。例えば'array.map(function(file){returnディスパッチ( 'get_signed_request'、file);})'。あなたが忘れてしまった場合、これを行うために、チェーンは壊れており、進む前にすべてを待つことはありません。 – jib

1

Promisse.allでは、iterable引数の約束がすべて解決されたときに解決する約束を返します。または、拒否する約束を最初に渡した理由で拒否します。

Mozillaのマニュアルhere。複数の非同期操作で待機しているために

Promise 
    .all(fileArray.map(file => dispatch('get_signed_request', file))) 
    .then(data => console.log("All your async operations are finished")); 
関連する問題