2

IndexedDB とサービス ワーカーを利用するオフラインの最初のブログ プラットフォームを作成しています。ここでの考え方は、ユーザーがオフラインで投稿を送信しようとしている場合に、バックグラウンドで送信するというものです。このプロジェクトは私の学位論文のためのものです。私はプロミスを 1 週間程度しか見ていません。単純なエラーである場合は申し訳ありません。

反応/還元での私の行動から、同期イベントを正常に送信しています。

以下は私の同期イベントハンドラのコードです

self.addEventListener('sync', function(event) {
  if (event.tag == 'send_post') {
    //const URL
    console.log('sync from SW - send post');
    //this should try again if promise is rejected
    event.waitUntil(
      openDatabase('Outbox').then( (db) => {
        return databaseGet('posts',db).then( (posts) => {
          return sendAllFromOutbox(posts)
        } )
      } )

    );
  }
});

以下はopenDatabaseです-(IndexedDB)

    function openDatabase(name) {
      return new Promise(function(resolve, reject) {
        var version = 10;
        var request = indexedDB.open(name, version);
        var db;
        request.onupgradeneeded = function(e) {
          db = e.target.result;
          e.target.transaction.onerror = reject;
        };
        request.onsuccess = function(e) {
          db = e.target.result;
          console.log('OPENED DATABASE');
          resolve(db);
        };
        request.onerror = reject;
      });
    }

以下はdatabaseGetです

function databaseGet(type,db) {
  return new Promise(function(resolve, reject) {
    var transaction = db.transaction([type], 'readonly');
    var store = transaction.objectStore(type);
    var request = store.getAll();
    request.onsuccess = function(e) {
      var result = e.target.result;
      resolve(result);
    };
    request.onerror = reject;
  });
}

そして最後に、以下はsendAllFromOutboxです

function sendAllFromOutbox(posts) {
  return fetch('https://stirapi.herokuapp.com/sendPost', {
    headers: {'Content-Type': 'application/json'},
    method: "POST",
    body: JSON.stringify(posts)
  })
  .then( (response) => {
    console.log('response from SW sendAllFromOutbox', response);
  } )
  .catch( (err) => {
    console.log('error from SW sendAllFromOutbox',err);
  } )
}

私の理解では、 sendAllFromOutbox が失敗/拒否した場合、再度呼び出されるはずです。しかし、呼び出されていないようです - したがって、バックグラウンドで送信されていません。

私のレポをチェックしたい場合は、https://github.com/georgecook92/Stirにあります。

ありがとうございました!

ジョージ

4

1 に答える 1

1

失敗した同期イベントをいつ再試行するかを決定するのはブラウザーです。syncEvent.lastChanceまた、無限に再試行するわけではありませんが、 ( spec )を介した最後の試行であることがわかります。

上記のコードを見ると、 がdatabaseGet期待されて(type,db)いますが、それを と呼んでいるため、未定義databaseGet('posts')の のプロパティにアクセスしようとするとエラーがスローされます。dbChrome の devtools はこれを表示する必要があり、特に「キャッチされたエラーでブレーク」します。

ここでの考え方は、ユーザーがオフラインで投稿を送信しようとしている場合に、バックグラウンドで送信することです。

ユーザーの現在の状態に関係なく、バックグラウンド同期を使用することをお勧めします。確かにnavigator.onLine、ユーザーが確実にオフラインであるかどうかonLineがわかりますが、真の場合、ユーザーはまだ信頼できる接続を持っていない可能性があります。

于 2016-08-09T09:54:46.447 に答える