が完了した後、私はそうのような非同期動作の連鎖でアップロード取得画像の配列を有します。コールバックすべての非同期操作
私は何らかの処置をとることができるように、すべての操作がいつ完了したかを知りたいと思います。
これはどのように達成できますか?
が完了した後、私はそうのような非同期動作の連鎖でアップロード取得画像の配列を有します。コールバックすべての非同期操作
私は何らかの処置をとることができるように、すべての操作がいつ完了したかを知りたいと思います。
これはどのように達成できますか?
これを試してください:あなたはそれが動作を示しコンソールに貼り付けることができ
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");
}
});
}
imageFileArray
が配列され、かつdispatch
は約束を返す場合、単に実行します。
Promise.all(imageFileArray.map(file => dispatch('get_signed_request', file)))
.then(results => console.log("finished"));
'console.log(" finished ")'は、他の多くのコードがディスパッチされる前に実行されます。 – softcode
@softcodeすべての約束を返すわけではありません。上記のコードでは、returnは暗黙の矢印関数であることに注意してください。したがって、通常の関数を使用している場合は、すべてを明示的に返すようにしてください。例えば'array.map(function(file){returnディスパッチ( 'get_signed_request'、file);})'。あなたが忘れてしまった場合、これを行うために、チェーンは壊れており、進む前にすべてを待つことはありません。 – jib
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"));
がそれを行う方法のアイデアのためにこれを見て:http://stackoverflow.com/questions/4631774/coordinating-parallel-execution-in-node-js/4631909# 4631909。基本的には、開始した数と完了した数を追跡する必要があります。次に、ロジックを書くのではなく、async.jsライブラリをチェックアウトしてください。 – slebetman
'imageFileObject'が配列の場合、forの代わりに' for 'を使うべきです。 – jib
@jibなぜですか?このケースの違いは何ですか? – softcode