Фоновая синхронизация занимает слишком много времени после подключения к интернету, рабочая коробка - PullRequest
1 голос
/ 12 марта 2019

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

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 минут. Есть ли способ выполнить фоновую синхронизацию сразу после повторного подключения к Интернету или хотя бы сократить время синхронизации.

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

1 Ответ

0 голосов
/ 25 марта 2019

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

В вашем работнике службы:

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'});
});
...