在PouchDB中,我在Web Worker中运行连续的单向复制,在UI线程上运行change listener。当Web Worker从服务器接收到更改并更新数据库时,更改侦听器不会立即看到它。除非有其他事件将监听器唤醒,例如UI编写,否则监听器不会看到它。唤醒后,侦听器发出更改并赶上。
是否有受支持的方式将新更改通知变更监听器?
通过阅读源代码,我想出了一种唤醒它的方法:
1)发布来自网络工作者的最后一条消息:
db.changes().on('change', change => {
self.postMessage({type: 'notify', seq: change.seq});
})
2)通过创建并立即取消连续更改发射器来处理UI线程上的消息:
worker.onmessage = (e) => {
const { type, seq } = e.data;
if (type === 'notify') {
db.changes({since: seq, continuous: true}).cancel();
}
}
这可行,因为under the covers 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)
唤醒更改侦听器。哇!
但是,这似乎有点hacky和脆弱。有支持的方法吗?