Ben*_*aum 37 javascript dispose promise bluebird
我已经在几个地方读过有关承诺处理器模式,但我无法弄清楚它是什么.有人建议我在代码中使用它,看起来像:
function getDb(){
return myDbDriver.getConnection();
}
var users = getDb().then(function(conn){
return conn.query("SELECT name FROM users").finally(function(users){
conn.release();
});
});
Run Code Online (Sandbox Code Playgroud)
什么是承诺处理器模式以及它如何应用于此?
注意 - 在原生承诺中,我.finally称之为"添加拒绝和履行处理程序,返回值但执行操作".如果重要的话,我在这种情况下使用蓝鸟.
Ben*_*aum 43
上述方法的问题在于,如果您在执行每次操作后都忘记释放连接getDb,那么当资源耗尽时,您的应用程序最终可能会冻结您的应用程序.
你可以在一个地方做:
var users = getDb().then(function(conn){
return conn.query("SELECT name FROM users");
});
Run Code Online (Sandbox Code Playgroud)
这将泄漏从未关闭的数据库连接.
处理器模式是将代码范围与拥有资源耦合的一种方式.通过将资源绑定到作用域,我们确保在完成它时始终释放它,并且我们不能轻易忘记释放它.它类似于usingC#,withPython和Java中的try-with-resource以及C++中的RAII.
看起来像:
withResource(function(resource){
return fnThatDoesWorkWithResource(resource); // returns a promise
}).then(function(result){
// resource disposed here
});
Run Code Online (Sandbox Code Playgroud)
如果我们将代码编写为:
function withDb(work){
var _db;
return myDbDriver.getConnection().then(function(db){
_db = db; // keep reference
return work(db); // perform work on db
}).finally(function(){
if (_db)
_db.release();
});
}
Run Code Online (Sandbox Code Playgroud)
我们可以将上面的代码编写为:
withDb(function(conn){
return conn.query("SELECT name FROM users");
}).then(function(users){
// connection released here
});
Run Code Online (Sandbox Code Playgroud)
处理器模式的用户的示例是sequelize和knex(书架的查询构建器).也可以将它用于更简单的事情,例如在完成所有AJAX请求时隐藏加载器.
由于您使用的蓝鸟,它一直致力于Promise.using与.disposer内置在功能,让你处理采取/一次你可能要考虑释放多个资源.