4

Service Worker から一連の PUT & POST リクエストを送信する必要があります。それらが送信される順序が重要です。

要件:

  • リクエスト メソッド、URL、および JSON 本文を指定して、リクエストを送信します
  • 成功した場合 ( response.status < 300):
    • body を success 関数に渡す
    • キュー内の次のリクエストを呼び出す
  • 失敗した場合:
    • responseText または err をエラー関数に渡す
    • 実行を停止

単純にキューを繰り返し処理し、fetchリクエストごとに呼び出すと、ネットワークの差異によって (多くの場合) リクエストがサーバーに順不同で到着する可能性があります。

fetch各結果が前の結果に依存する一連の要求を作成するにはどうすればよいですか?


私が試したこと:

  • 代わりに XHR を使用します (「async: false」を使用できると仮定しますが、これは Service Worker では許可されていません)。
  • setTimeout(sendRequest, i*200). ハック、信頼できません。
  • Promise loopsこれらの例ES6 Promise Patternsに基づいています。これは最も有望に思えましたが、例は成功を想定した単純なケースです。フェッチで動作させることはできません。

コンテキスト: API リクエストの「アウトボックス」を使用して、オフラインでのデータの読み取り、作成、および更新をサポートしています。この順序の問題を除いて、うまく機能します。

4

2 に答える 2

3

キュー内の各リクエストをすぐに Promise に変換するのではなく、必要に応じてエントリをキューからポップしてみませんか?

var workQueue = [work, goes, here];
var currentItem = workQueue.shift();
return performWorkWith(currentItem)
         .then(handleResponseWithQueue(workQueue));

function handleResponseWithQueue(queue) {
  return function handleResponse(response) {
      if (response.ok && queue.length > 0)
        return performWorkWith(queue.shift()).then(handleResponseWithQueue(queue));
  };
}

このパターンを (単純化して) 次のように一般化できます。

function series(work, queue) {
  if (queue.length <= 0) return;
  work(queue.shift()).then(function() {
    if (queue.length > 0) return series(work, queue);
  });
}
于 2015-09-08T14:43:41.590 に答える