PouchDB在离线时保持轮询

时间:2014-03-23 13:04:09

标签: couchdb pouchdb

我正在使用PouchDB作为本地数据库和CouchDB作为中央数据库的webapp。我使用PouchDB的原因之一是我想利用我的应用程序中的离线支持。 然而,我遇到了一个小问题。当脱机并再次上线时,PouchDB不再同步。我必须刷新浏览器才能让它再次开始同步。一种解决方案是,即使应用程序处于脱机状态,PouchDB也会在离线时继续轮询远程数据库,这将导致当它再次联机时同步将再次启动。另一个解决方案是让用户再次手动告诉应用程序它在线并从那里获取同步。

我如何告诉PouchDB再次开始同步?如果我能做到这一点,我可以解决我的问题。

4 个答案:

答案 0 :(得分:2)

PouchDB 3.1.0为复制API实现retry选项。

https://github.com/pouchdb/pouchdb/commit/47d105edaa9e36006124636235be8016c2e8c52c

PouchDB.replicate.sync('http://remote', {
    live: true,
    retry: true
})

答案 1 :(得分:1)

PouchDB的目标是通过功能奇偶校验CouchDB,CouchDB复制的一个特点是它会在一段时间后超时,如果它处于脱机状态,那么这将要求你你已经注意到,再次开始复制。

有一个关于无限复制的开放问题(https://github.com/pouchdb/pouchdb/issues/966),所以这不是问题但是在此之前你可以使用你用来开始复制的同一个复制调用:

db.replicate.to(remoteDB, [options]);

http://pouchdb.com/api.html#replication

一种选择是尝试类似http://github.hubspot.com/offline/docs/welcome/的内容,但希望我们可以将此功能添加到PouchDB中。

答案 2 :(得分:1)

我的诀窍是在出现错误时重新启动复制:

var retryMs = 2000;
function replicateFrom() {
  var opts = {live: true};
  db.replicate.from(remoteCouch, opts).on('error', function() {
    console.log('replication error');
    setTimeout(replicateFrom, retryMs);
  });
}

db.replicate.to

可以做同样的事情

答案 3 :(得分:1)

我刚刚发布了pouchdb-persist,一个用于持久复制的插件。有了这个插件,你可以做到

var db = new PouchDB('todos');

// Instead of db.replicate()
var persist = db.persist({ url: 'http://localhost:5984/todos' });

您还可以收听connectdisconnect事件。