3

Service Worker の起動時に非同期作業が完了するまで、Service Worker がフェッチ イベントの処理を開始するのを待機させることはできますか?

データで定義されたルートを持つアプリ シェルがあります。Service Worker の起動時に特定のルート フェッチ ハンドラーをインストールするには、IndexedDB (非同期) からルート データをルックアップする必要があります。

残念ながら、Service Worker は、IndexedDB ルックアップが完了してルートのフェッチ処理をセットアップする前に、フェッチ イベントの受け入れを開始します。

今のところ、このために特別なケースのデフォルト ハンドラーをハードコーディングしているだけですが、Service Worker の起動時に IndexedDB の処理が完了するまで、Service Worker がフェッチ イベントの処理を遅らせるようにするとよいでしょう。

これを「waitUntil」する方法が見当たりませんでした。

4

3 に答える 3

6

この問題について100%明確ではないため、コードスニペットが役立ちます...しかし、いくつかの推測を行います:

install イベントをリッスンしたときに event.waitUntil に提供された promise を解決するまで、SW はネットワーク リクエストをインターセプトしないため、そこで IDB を設定しても問題ありません。

一般に、フェッチ イベント リスナを実行して何もしないだけでも問題ありません。その場合、ブラウザは通常どおりネットワークにフォールバックするためです。

一般に、SW は頻繁に強制終了される可能性があり、また実際に強制終了されるため、ローカル変数が異なるイベントの受信間で固執しないことも念頭に置いておく価値があります。別のイベントを処理するときに必要なデータがある場合は、IDB またはキャッシュ API に保持し、そこから再度フェッチする必要があります。

于 2015-12-01T07:03:58.033 に答える
3

回避策があります:

function startupAsyncStuff() {
  return new Promise(function (fulfill, reject) {
    // put here your async stuff and fulfill the promise when done.
  });
}

// Launch your startup async code
var asyncStuffDone = startupAsyncStuff();

// On fetch, wait for the former promise to be resolved first
self.onfetch = function (event) {
  event.respondWith(asyncStuffDone.then(function () {
    // your fetch handling code
  }));
};
于 2016-01-08T15:42:23.620 に答える
0

私はsw-toolboxを使用していて、起動時にルート ハンドラをセットアップする非同期作業を実行していたので、ハンドラが応答する準備ができるまで一時的な sw-toolbox デフォルト ハンドラを定義するのが最善の解決策でした。

var toolbox = require('sw-toolbox');

var setupPromise = someAsyncHandlerSetup()
.then(function () {
  // make default handler temporary, allows other fetch handlers.
  toolbox.router.default = null;
});

// until the async handler setup is done, provide a default handler
// to avoid an offline-dino flash when starting up while offline. 
toolbox.router.default = function defaultHandler (request) {
  return setupPromise.then(function () {
    var handler = toolbox.router.match(request);
    if (handler) {
      return handler(request);
    }
    throw new Error('default handler could not handle ' + request.url);
  });
};
于 2016-04-01T20:56:00.557 に答える