Фоновая синхронизация работника службы - при отклонении обещания - нет повторных попыток в waitUntil?

Я создаю первую автономную блог-платформу, которая использует IndexedDB и сервисных работников. Идея в том, что если пользователь не в сети и пытается отправить сообщение, отправьте его в фоновом режиме. Этот проект предназначен для моей диссертации, я смотрю на обещания в течение недели или около того - извинения, если это простая ошибка!

Из моих действий в реагировать / редукса я успешно отправляю событие синхронизации.

Ниже приведен код для моего обработчика событий синхронизации

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.

Спасибо!

Джордж

1 ответ

Решение

Браузер должен решить, когда событие неудачной синхронизации следует повторить. Кроме того, он не будет повторяться бесконечно, но вы знаете, что это последняя попытка через syncEvent.lastChance ( спец)

Глядя на ваш код выше, databaseGet надеется (type,db), но ты называешь это databaseGet('posts'), так что вы получите ошибку при попытке доступа к свойствам db, который не определен. Devtools в Chrome должны показать это, особенно с "ошибкой при обнаружении ошибок".

Идея в том, что если пользователь не в сети и пытается отправить сообщение, отправьте его в фоновом режиме.

Лучше использовать фоновую синхронизацию независимо от текущего состояния пользователя. Конечно, navigator.onLine скажет вам, если пользователь определенно не в сети, но если onLine Это правда, что пользователь все еще не может иметь надежное соединение.

Другие вопросы по тегам