如何从网络工作者通知PouchDB更改?

时间:2019-03-30 17:02:30

标签: pouchdb

在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和脆弱。有支持的方法吗?

0 个答案:

没有答案