2014-11-08 92 views
0

我正在连接到远程数据库并侦听更改,但希望停止侦听的功能。 PouchDB似乎具有我需要的所有功能,但正确设置它似乎是一个问题。 PouchDB的文档有我遵循的简单例子。新的PouchDB()承诺过早返回?

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

changes.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()永远不会执行。有什么想法吗?

回答

0

self.db.changes不存在。 self.db指向承诺(您自己致电console.log(self.db)表明)。

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