В 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)
Просыпается слушатель изменений.Ура!
Но это кажется хакерским и хрупким.Есть ли поддерживаемые способы сделать это?