Фоновая синхронизация занимает слишком много времени после подключения к Интернету, рабочая панель

Я использую сервис-воркер для обеспечения функции фоновой синхронизации. Вот мой код:

importScripts(   'https://storage.googleapis.com/workbox-cdn/releases/3.6.3/workbox-sw.js' )

const queue = new workbox.backgroundSync.Queue('registerQueue', {   callbacks: {
    queueDidReplay: function(requestArray) {
      let requestSynced = 0
      requestArray.forEach(item => {
        if (!item.error) {
          requestSynced++
        }
      })

      if (requestSynced > 0) {
        new BroadcastChannel('backgroundSynBroadCastChannel').postMessage(
          requestSynced
        )
      }
    }   } }) const GraphQLMatch = /graphql(\S+)?/

self.addEventListener('fetch', event => {   if (
    null !== event.request.url.match(GraphQLMatch) &&
    navigator.onLine === false   ) {
    const promiseChain = fetch(event.request.clone()).catch(err => {
      return queue.addRequest(event.request)
    })

    event.waitUntil(promiseChain)   } })

self.addEventListener('message', event => {   if (!event.data) {
    return   }

  switch (event.data) {
    case 'skipWaiting':
      self.skipWaiting()
      break
    default:
      break   } })

workbox.precaching.precacheAndRoute([])

/*  *   Alternate for navigateFallback & navigateFallbackBlacklist  */ workbox.routing.registerNavigationRoute('/index.html', {   blacklist: [/^\/__.*$/] })

При отключении от Интернета запросы ставятся в очередь в индексированной БД. Но проблема в том, что после восстановления соединения фоновая синхронизация выполняется как минимум через 5-10 минут. Есть ли способ выполнить фоновую синхронизацию сразу после повторного подключения к Интернету или хотя бы сократить время синхронизации.

Заранее спасибо.


person Yeasin Hossain Mohammad    schedule 12.03.2019    source источник


Ответы (2)


Вы можете вручную запустить воспроизведение очереди, как только ваше соединение восстановится, отправив событие сервисному работнику.

В вашем сервис-воркере:

self.addEventListener('message', (event) => {
  if (event.data.type === 'replayQueue') {
    queue.replayRequests();
  }
});

В вашем приложении (используя рабочее окно-окно):

if ('serviceWorker' in navigator) this.wb = new Workbox('/service-worker.js');

window.addEventListener(‘online’, function(event){
     this.wb.messageSW({type: 'replayQueue'});
});
person Cyril Hanquez    schedule 25.03.2019

К сожалению, сейчас не похоже, что можно изменить время синхронизации. Согласно документации Google Workbox:

Браузеры, поддерживающие BackgroundSync API, будут автоматически воспроизводить неудавшиеся запросы от вашего имени через интервал, управляемый браузером, вероятно, используя экспоненциальную отсрочку между попытками воспроизведения.

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

Идея @ cyril-hanquez хороша до тех пор, пока пользователь по-прежнему использует ваш сайт, когда возвращается в онлайн. Вы также можете захотеть добавить обратный вызов fetchDidFail для обработки большего количества граничных случаев сбоя сети. В соответствии с этими строками: вы можете не полагаться на статус "navigator.onLine", поскольку он не всегда делает то, что можно было бы ожидать < / а>.

person James    schedule 09.12.2019