Фоновото синхронизиране отнема твърде много време след установяване на интернет връзка, работна кутия

Използвам service worker, за да постигна функционалност за фоново синхронизиране. Следва моят код:

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();
  }
});

Във вашето приложение (с помощта на workbox-window):

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:

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

Ако документацията на Google е правилна (поне за Chrome), това също означава, че колкото по-дълго потребителят е бил офлайн, вероятността за по-дълго чакане за събитието за синхронизиране се увеличава.

Идеята на @cyril-hanquez е добра, стига потребителят все още да използва вашия сайт, когато се върне онлайн. Може също да искате да добавите обратно извикване „fetchDidFail“, за да се справите с повече крайни случаи на прекъсване на мрежата. По този начин: може да искате да избягвате да разчитате на състоянието на "navigator.onLine", тъй като то не винаги прави това, което човек би очаквал.

person James    schedule 09.12.2019