Фоновая синхронизация JavaScript перестает работать, если страница загружается / обновляется в автономном режиме

В настоящее время я изучаю, как использовать фоновую синхронизацию, чтобы пользователи могли вносить изменения PUT / POST при использовании веб-приложения в автономном режиме.

Я выполнил инструкции, данные Джейком Арчибальдом в Знакомство с фоновой синхронизацией , и все работало отлично ... пока я регистрирую фоновую синхронизацию, когда веб-приложение загружалось, находясь в сети. Я имею в виду следующее:

Шаги, которые работают:

  1. Находясь в сети, я открываю веб-приложение
  2. Я включаю офлайн-режим на вкладке сети
  3. Я нажимаю несколько кнопок, которые регистрируют фоновую синхронизацию.
  4. Я выключаю офлайн-режим, и приложение снова в сети.
  5. Запускается фоновая синхронизация.

Действия, которые приводят к прекращению работы:

Он полностью перестанет работать даже в описанном выше сценарии, если я сделаю следующее:

  1. Находясь на другом сайте, я включаю автономный режим на вкладке сети.
  2. Я перехожу в свое веб-приложение, которое доступно офлайн благодаря работнику службы.
  3. Я нажимаю несколько кнопок, которые должны регистрировать фоновую синхронизацию.
  4. Я выключаю офлайн-режим на вкладке сети.
  5. Ничего не произошло.
  6. После того, как я перейду на вкладку «Приложение», отменю регистрацию сервисного работника и попробую снова из новой установки, первые шаги работают, но второй набор шагов продолжает нарушать фоновую синхронизацию.

Код:

На странице:

//requesting a one-off sync:
navigator.serviceWorker.ready.then(function (reg) {
  return reg.sync.register('sync-tag');
}).catch(function (e) {
  console.error(e, "System was unable to register for a sync");
});

В сервисном работнике

self.addEventListener('sync', event => {
  if (event.tag == 'sync-tag') {
    event.waitUntil( doStuff() )
  }
});

Обновлять

Когда код работает, я использовал следующий код для отслеживания тегов, отправленных на регистрацию:

navigator.serviceWorker.ready.then(function (reg) {
  console.log('before', reg.sync.getTags());
  reg.sync.register('sync-tag');
  console.log('after', reg.sync.getTags());
}).catch(function (e) {
  console.error(e, "System was unable to register for a sync");
});

При использовании тех шагов, которые работают, я получаю

before: resolved to an empty array
after: resolved to an array with one tag ['sync-tag']

При выполнении действий, которые приводят к прекращению работы:

before: resolved to an array with one tag ['sync-tag']
after: resolved to the same array above

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

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

Благодарим вас за терпение и будем благодарны за любую помощь в понимании того, как заставить работать фоновую синхронизацию.


person Alexandro Perez    schedule 23.08.2018    source источник
comment
У меня то же самое произошло в здесь   -  person user2573099    schedule 29.01.2021


Ответы (1)


Хорошо, я чувствую себя глупо. Браузер действительно решает, когда выполнять фоновую синхронизацию.

Я ожидал неправильного поведения:

  1. Доступ к приложению в автономном режиме.
  2. Изменения POST / PUT с фоновой синхронизацией
  3. Вернитесь в Интернет, обновите страницу, чтобы сразу увидеть изменения

Фактическое поведение, реализованное в браузере:

Доступ к приложению в режиме онлайн:

  1. Доступ к приложению онлайн.
  2. приложение отключается (вручную или нет)
  3. Изменения POST / PUT с фоновой синхронизацией
  4. приложение подключается к сети и обновляется
  5. Изменения происходят мгновенно, поскольку синхронизация происходит, как только приложение выходит в Интернет. Браузер может обнаружить переход из онлайн в офлайн обратно в онлайн?

Доступ к приложению в автономном режиме

  1. Доступ к приложению в автономном режиме.
  2. Изменения POST / PUT с фоновой синхронизацией.
  3. приложение подключается к сети и обновляется
  4. Изменения не мгновенные. Как-то браузер решает пока не делать синхронизацию.
  5. Полностью закройте браузер и вернитесь на страницу
  6. Браузер синхронизируется.

Поэтому трудно узнать, когда браузер выполнит синхронизацию, и только при доступе к приложению в режиме онлайн он синхронизируется, если он обнаруживает изменение из автономного режима, а затем в онлайн в том же сеансе (без обновления?)

person Alexandro Perez    schedule 23.08.2018