0

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

4

1 に答える 1

0

他のファイルのダウンロードを停止します

それはどういう意味ですか?IO はメイン スレッドの外で発生し、javascript を実行してもダウンロードは続行されます。ただし、結果に対して重い処理を行う場合は、メインの UI スレッドをブロックしないようにWebworkersを調べる必要があるかもしれません。

于 2015-06-06T17:59:24.063 に答える