20

Service Workers を使用して、既存の Web サイトを強化したいと考えています。特に、実際のリソースが利用できない場合に、Service Worker がプレースホルダー リソースを使用してリクエストに応答するようにすることで、より優れたオフライン サポートを追加したいと考えています。このアプローチは機能していましたが、障害に遭遇しました。サイトには、同期XHR リクエストを使用して特定のリソースをロードする場所がいくつかありますが、サービス ワーカーは Chrome でそれらのイベントを受信しません。(同期 XHR リクエストを排除することを提案しないでください。それは望ましいことですが、範囲外です。)

Service Worker が同期 XHR リクエストに応答することは可能でしょうか? これは実装が複雑であると想像でき、サポートされていない場合は理解できます。W3C Service Workers Specification (Working Draft)WHATWG Fetch Specification (Living Standard)の間には「正しい」答えが存在するはずですが、まだ解読が終わっていません。これがサポートされるべきかどうかを仕様がどのように記述しているかについての説明、および/またはこの動作の指定または実装に関する議論への参照をいただければ幸いです。

4

3 に答える 3

0

非同期呼び出しを連鎖させることで、同期効果を作成できます。インデントされたコールバックが作成されますが、promise を使用するとコードが読みやすくなりますが、2 回目の Ajax 呼び出しは最初の呼び出しが返されるまで行われません。両方の呼び出しで 3 番目のパラメーターが true に設定されていることに注意してください。

// Synchronized Ajax calls using 2 nested Asynchronous calls

// Asynchronous request #1 using traditional API
const axhr = new XMLHttpRequest();
axhr.open('GET', '/__so-example__', true);
axhr.onload = event => {
  console.log("A-XHR: " + axhr.responseText);

  // Asynchronous request #2 using traditional API
  const sxhr = new XMLHttpRequest();
  sxhr.open('GET', '/__so-example__', true);
  sxhr.onload = event => {
    console.log("S-XHR: " + sxhr.responseText);
  }
  sxhr.send();
}
axhr.send();

これはほんの一例です。同期効果を作成するために、プロミスを同じように簡単に連鎖させることができると思います (ただし、右インデントではなく垂直に積み重ねます)。

于 2016-03-16T23:26:11.940 に答える