新的PouchDB()承诺过早回归?

时间:2014-11-08 20:22:14

标签: couchdb pouchdb

我正在连接到远程数据库并侦听更改,但希望能够停止侦听。 PouchDB似乎具有我需要的所有功能,但正确设置似乎是一个问题。 PouchDB的文档有一个简单的例子我跟随。

var changes = db.changes({
  since: 20,
  live: true
}).on('change', function(change) { });

changes.cancel();

在下面的代码中,我建立了我的远程数据库源代码,一旦成功完成,我就设置了我的监听器并保存了我的更改监听器,以便稍后调用cancel。整个事情返回一个承诺,所以我的应用程序的其余部分可以知道我们什么时候准备好了... db和changelistener在应用程序的其他地方定义,并且可以通过" this.xxx"或" self.xxx"当范围需要时。

SyncService.prototype.openDB = function(){
    console.log("open db");
    var self = this;

    var deferred = this.$q.defer();

    this.db = new PouchDB("http://localhost:5984/somedb")
    .then( function(){
        console.log("db source established");
        console.log( self.db );

        self.changeListener = self.db.changes({
            live: true,
            include_docs: true,
            since: "now"
        })
        .on('change', function( changes ){
            console.log( changes );
        })
        .on('error', function(err){
            console.log(err)
        });

        console.log( self.changeListener );

        deferred.resolve();

    }, function(err){
        console.log( err );
        deferred.reject();
    });

    return deferred.promise;
}

当我运行它时,我的数据库已经创建,但似乎是新的PouchDB"过早地执行。我的控制台日志看起来像这样..

open db
db source established
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}

......那就是它。数据库承诺似乎已解决,但似乎在控制台日志中处于待处理阶段..我们从未通过设置监听器的代码段。永远不会执行deferred.resolve()。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

self.db.changes不存在。 self.db指向一个承诺(您自己对console.log(self.db)的调用表明了这一点。)

您必须在成功处理程序上接受database参数,然后使用database.changes(...)调用更改API。