【问题标题】:PouchDB sync not giving a complete eventPouchDB 同步没有给出完整的事件
【发布时间】:2017-08-25 14:08:20
【问题描述】:

我的 PouchDB 同步代码没有产生完整的事件。

我确实收到了更改以及活动和暂停事件(按此顺序),并且数据库最终会同步(即使没有太多数据,也要经过很长时间的等待)。

我需要完整的事件,以便知道远程 CouchDB 数据何时可以在本地使用。

我的代码如下所示:

  init(localDBName, remoteDBName)
  // Initialises the database - Called every time the App starts or the user logs in or registers
  // If remoteDBName is false we don't want to sync data to the server
  {

    // Create a new database or open it if it already exists
    this._DB = new PouchDB(localDBName);
    this.remote = remoteDBName;          // If remoteDBName is false we don't sync data to the server

    console.log('Data: init(): PouchDB database opened for localDBName = ' + localDBName + ' : ' + this._DB + ', remoteDBName = ' + this.remote);

    // Sync to remote DB if we have been asked to
    if (this.remote)
    {
      // Insert the url for the CouchDB server into the remoteDBName returned by PouchDB
      var realRemoteDB = this.remote.replace("localhost:5984", COUCHDB_SERVER_URL);

      console.log('Data: init: remoteDB path being used is: ' + realRemoteDB);

      let options = {
        live: true,
        retry: true,
        continuous: true
      };

      return this._syncHandler = this._DB.sync(realRemoteDB, options)
        .on('complete', (info) => {
          console.log('***** DATA: init() Complete: Handling syncing complete');
          console.dir(info);
        })
        .on('change', (info) => {
          console.log('***** DATA: init() Change: Handling syncing change');
          console.dir(info);
        })
        .on('paused', (info) => {
          console.log('***** DATA: init() Paused: Handling syncing pause');
          console.dir(info);
        })
        .on('active', (info) => {
          console.log('***** DATA: init() Active: Handling syncing resumption');
          console.dir(info);
        })
        .on('error', (err) => {
          console.log('***** DATA: init() Error: Handling syncing error');
          console.dir(err);
        })
        .on('denied', (err) => {
          console.log('***** DATA: init() Denied: Handling syncing denied');
          console.dir(err);
        });
    }
    else {
      this.syncHandler = null;
    }
  }

我得到的最后一个事件是 paused 事件,它在更改事件显示数据已从服务器中提取后立即触发。

【问题讨论】:

    标签: database-replication pouchdb


    【解决方案1】:

    这实际上是它应该工作的方式;)

    sync 方法的行为取决于您指定的选项:

    • 没有live 选项:在正常同步(没有live 选项)中,complete 事件将像您想象的那样工作:它会在同步完成后触发。

    • 使用live 选项:在实时复制/同步中,同步永远不会完成,因为它是连续的。只有在取消复制时才会触发complete 事件。请参阅文档here(我强调了重要部分):

      complete (info) - 此事件在复制完成或取消时触发。 在实时复制中,只有取消复制才会触发此事件。


    为了解决您的问题,您最初可以不使用live 选项进行同步。如果此同步完成,您的远程数据应该在本地可用。

    现在在complete 事件处理程序中,您可以启动实时复制以开始持续同步。

    代码可能如下所示:

    this._DB.sync(realRemoteDB) //No options here -> One time sync
            .on('complete', (info) => {              
              this._DB.sync(realRemoteDB, options); //Continous sync with options
            });
    

    【讨论】:

    • 谢谢@phonolog。我采取了“当复制完成或取消时”来表示当复制完成或取消时,甚至应该触发。我尝试过不进行实时同步,但它仍然需要很长时间才能完成,我需要知道它何时完成,所以我不确定你的代码将如何给我。
    • 感谢@phonolog 的额外解释现在有意义了。
    • 变更事件怎么样。const remoteDatabase = new PouchDB(remote); this.localdb.sync(remoteDatabase, { since: 'now', live: true, retry: true, // include_docs: true, }).on('change', (change: any) => { console.log('changed item' + change); this.listener.emit(change); console.log(change); }).变更永远不会触发
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 2014-12-23
    相关资源
    最近更新 更多