Как уведомить PouchDB об изменениях от веб-работника? - PullRequest
1 голос
/ 30 марта 2019

В PouchDB у меня есть непрерывная односторонняя репликация, работающая в веб-работнике, и прослушиватель изменений , работающий в потоке пользовательского интерфейса.Когда веб-работник получает изменения от сервера и обновляет базу данных, слушатель изменений не сразу их видит.Слушатель не видит его, пока какое-то другое событие не разбудит слушателя, например, запись пользовательского интерфейса.Как только он проснется, слушатель отправит изменение и поймает.

Есть ли какой-либо поддерживаемый способ уведомить слушателя изменений о новых изменениях?

Из чтения исходного кода, Я придумал этот метод, чтобы разбудить его:

1) отправить сообщение от веб-работника с последним seq:

db.changes().on('change', change => {
  self.postMessage({type: 'notify', seq: change.seq});
})

2) обработать сообщение в потоке пользовательского интерфейса, создав инемедленно отменяет источник непрерывного изменения:

worker.onmessage = (e) => {
  const { type, seq } = e.data;
  if (type === 'notify') {
    db.changes({since: seq, continuous: true}).cancel();
  }
}

И это работает, потому что под крышками PouchDB делает это:

  if (opts.continuous) {
    var id = dbName + ':' + uuid();
    changesHandler.addListener(dbName, id, api, opts);
    changesHandler.notify(dbName); // <-- wake up!
    return {
      cancel: function () {
        changesHandler.removeListener(dbName, id);
      }
    };
  }

... и changesHandler.notify(dbName)Просыпается слушатель изменений.Ура!

Но это кажется хакерским и хрупким.Есть ли поддерживаемые способы сделать это?

...