Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用promises重用mongo连接_Javascript_Mongodb_Promise_Bluebird - Fatal编程技术网

Javascript 如何使用promises重用mongo连接

Javascript 如何使用promises重用mongo连接,javascript,mongodb,promise,bluebird,Javascript,Mongodb,Promise,Bluebird,如何更改db连接调用中的内容,以便执行db.collection(): 我的代码总是调用getDb,这样就可以创建连接,所以这不是问题。例: this.getDb().then(test.bind(this)); 但事实上,我把这些电话中的许多都挂了起来,以便寻找一种更干净的方法 这是有效的-只是想知道是否有一个整体上更好的方法来处理这个问题 Job.prototype.getDb = function(id) { var self = this; return new P(funct

如何更改db连接调用中的内容,以便执行
db.collection()

我的代码总是调用
getDb
,这样就可以创建连接,所以这不是问题。例:

this.getDb().then(test.bind(this));
但事实上,我把这些电话中的许多都挂了起来,以便寻找一种更干净的方法

这是有效的-只是想知道是否有一个整体上更好的方法来处理这个问题

Job.prototype.getDb = function(id) {
  var self = this;
  return new P(function(resolve, reject) {
    if (!self.db) {
      return Mongo.connectAsync(self.options.connection)
      .then(function(c) {
        self.db = c;
        debug('Got new connection');
        resolve(c);
      });
    }
    debug('Got existing connection');
    resolve(self.db);
  });
};
我想这真的只是一个mongo连接问题,也许不仅仅是承诺。我看到的所有Mongo示例要么只是在connect回调中进行所有调用,要么使用诸如Express之类的框架并在开始时分配它

我希望能够做到这一点

return this.db.collection('abc').findAsync()
不,当您不知道数据库是否已连接时,这是不可能的。如果您可能需要首先进行连接,而这是异步的,那么
this.db
必须产生一个承诺,并且您需要使用
then

请注意,使用Bluebird,您可以将代码缩短一点,并使用以下命令避免冗长的
。然后()
回调:


恐怕不行,否则你怎么知道已经成功异步建立了连接?@SecondRikudo-之所以存在连接,是因为我总是调用
getDb
-请参阅我的编辑。连接不是问题-大部分清理都是问题。对于清理,bluebird提供了
.dispose()
。如果您能提到disposer模式,可能是
.disposer
和适当的资源管理,那就太好了。以这种方式缓存连接有点冒险。@BenjaminGruenbaum:现在您已经提到了它们:-)我不确定如何缓存可支配资源,或者您的意思是它们根本不应该缓存(只在mongo内部)?如果你能写下你自己的答案,这可能是值得的……但我不清楚为什么我的方法是否定的。看起来效果很好。我听到反模式,但坦率地说,在这一点上,我想进入链接mongo方法,这将是它自己的事情。它不是在创建要在下一个链接承诺之前设置的
self.db
连接吗?我没有看到这个问题,尽管这可能是一个时间问题。我基本上是想在Express/Hapi中重新创建流程,其中在开始时创建连接,然后在链接中使用。
return this.db.collection('abc').findAsync()
Job.prototype.getDb = function() {
  if (!this.db)
    this.db = Mongo.connectAsync(this.options.connection);
  return this.db;
};
Job.prototype.test = function() {
  return this.getDb().call('collection', 'abc').call('findAsync');
};