Фоновая синхронизация рабочего стола c не запускается при настройке обратного вызова onSyn c - PullRequest
0 голосов
/ 07 февраля 2020

В моем сервисном работнике я внедряю фоновую синхронизацию c с рабочей коробкой, например, так:

workbox.routing.registerRoute(
    options => options.url.pathname.startsWith('/api/'),
    new workbox.strategies.NetworkOnly({
        plugins: [
            new workbox.backgroundSync.Plugin('myQueueName', {
                maxRetentionTime: 14 * 24 * 60,
                onSync() {
                    showNotification('background sync ran.');
                }
            })]
    }),
    'POST'
);

Когда я тестирую поведение, отключая доступ к сети, выполняя запрос и затем снова включая доступ к сети Я вижу уведомление, которое вызывается в showNotification, но я не вижу фактические запросы.

Как ни странно, когда я удаляю обратный вызов onSync, я теперь вижу запросы но, очевидно, я не создаю никаких уведомлений. Как я могу получить обратный вызов и , чтобы воспроизвести фактические запросы?

1 Ответ

0 голосов
/ 07 февраля 2020

Я посмотрел на реализацию workbox и нашел следующий код:

class Queue {
  ...

  constructor(name, {onSync, maxRetentionTime} = {}) {
    ...
    this._onSync = onSync || this.replayRequests;
...   

и далее вниз

_addSyncListener() {
    if ('sync' in registration) {
      self.addEventListener('sync', (event) => {
          ...

          const syncComplete = async () => {
            this._syncInProgress = true;

            let syncError;
            try {
              await this._onSync({queue: this});

Так что, как оказалось, когда вы этого не делаете передать onSync обратный вызов, по умолчанию будет звонить replayRequests. Если вы сдали один, вы должны сделать это самостоятельно, например, так:

workbox.routing.registerRoute(
    options => options.url.pathname.startsWith('/api/'),
    new workbox.strategies.NetworkOnly({
        plugins: [
            new workbox.backgroundSync.Plugin('myQueueName', {
                maxRetentionTime: 14 * 24 * 60,
                onSync({ queue }) {
                    // !!! important call here !!!
                    queue.replayRequests(); 
                    showNotification('background sync ran.');
                }
            })]
    }),
    'POST'
);
...