Promise を使用して XHR を使用したい。HTML5 rocks (1) および Mozilla の Web サイト (2) で提案されている XHR Promise を作成しました。
期待どおりに動作しません。ファイルをロードして処理する次のシーケンスがあるとします。
sequence = xhrPromise('filename').
.then(parseFile)
.then(processFile)
.then(allSet);
1 つのシーケンスを実行するだけで、期待どおりに動作します。
N 個のファイルをダウンロード/処理するために Promise.all() で N 個のシーケンスを実行しようとすると、失敗します。
すべてのダウンロードは「並行して」開始され、最初の XHR リクエストが完了すると、他のファイルのダウンロードが停止され、このファイルの完全なシーケンスが実行されてから、残りのファイルのダウンロードが再開されます。次に、別のファイルが完了すると、ダウンロードをブロックし、このファイルのシーケンスを実行してから、ダウンロードを再開します。
XHR プログレス イベントがメイン タスク キューにスローされ、promise がマイクロ タスク キューを使用しているため、これは予想される動作のようです。
それは理にかなっていますか?
XHR の代わりに「フェッチ」API を使用すると期待どおりに動作するようですが、ダウンロードの進行状況を監視できないことは、私にとって大きな問題です。
この問題を回避する良い方法はありますか?
(1) http://www.html5rocks.com/en/tutorials/es6/promises/
(2) https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise