什么是承诺处理器模式?
What is the promise disposer pattern?
我在好几个地方都读到过 promise 处理器模式,但我不明白它是什么。有人建议我在如下代码中使用它:
function getDb(){
return myDbDriver.getConnection();
}
var users = getDb().then(function(conn){
return conn.query("SELECT name FROM users").finally(function(users){
conn.release();
});
});
什么是 promise 处理器模式,它在这里如何应用?
注意 - 在本机承诺中,我将 .finally
填充为 "add both rejection and fulfillment handlers that return the value but perform an action"。如果重要的话,我在这种情况下使用蓝鸟。
你的代码有问题
上述方法的问题在于,如果您在每次执行 getDb
后忘记释放连接,您就会发生资源泄漏,最终可能会在应用程序耗尽资源时冻结您的应用程序再漏水。
你可以在一个地方做:
var users = getDb().then(function(conn){
return conn.query("SELECT name FROM users");
});
这将泄漏从未关闭的数据库连接。
处理器模式
处置器模式是一种将代码范围与拥有资源相结合的方法。通过将资源绑定到一个范围,我们确保它在我们使用完后总是被释放,并且我们不会轻易忘记释放它。它类似于 C# 中的 using
、Python 中的 with
和 Java 中的 try-with-resource 以及 C++ 中的 RAII。
看起来像:
withResource(function(resource){
return fnThatDoesWorkWithResource(resource); // returns a promise
}).then(function(result){
// resource disposed here
});
在这里应用它
如果我们把代码写成:
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();
});
}
我们可以将上面的代码写成:
withDb(function(conn){
return conn.query("SELECT name FROM users");
}).then(function(users){
// connection released here
});
处理器模式的用户示例是 sequelize and knex(书架的查询生成器)。也可以将它用于更简单的事情,例如在所有 AJAX 请求完成时隐藏加载程序。
我在好几个地方都读到过 promise 处理器模式,但我不明白它是什么。有人建议我在如下代码中使用它:
function getDb(){
return myDbDriver.getConnection();
}
var users = getDb().then(function(conn){
return conn.query("SELECT name FROM users").finally(function(users){
conn.release();
});
});
什么是 promise 处理器模式,它在这里如何应用?
注意 - 在本机承诺中,我将 .finally
填充为 "add both rejection and fulfillment handlers that return the value but perform an action"。如果重要的话,我在这种情况下使用蓝鸟。
你的代码有问题
上述方法的问题在于,如果您在每次执行 getDb
后忘记释放连接,您就会发生资源泄漏,最终可能会在应用程序耗尽资源时冻结您的应用程序再漏水。
你可以在一个地方做:
var users = getDb().then(function(conn){
return conn.query("SELECT name FROM users");
});
这将泄漏从未关闭的数据库连接。
处理器模式
处置器模式是一种将代码范围与拥有资源相结合的方法。通过将资源绑定到一个范围,我们确保它在我们使用完后总是被释放,并且我们不会轻易忘记释放它。它类似于 C# 中的 using
、Python 中的 with
和 Java 中的 try-with-resource 以及 C++ 中的 RAII。
看起来像:
withResource(function(resource){
return fnThatDoesWorkWithResource(resource); // returns a promise
}).then(function(result){
// resource disposed here
});
在这里应用它
如果我们把代码写成:
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();
});
}
我们可以将上面的代码写成:
withDb(function(conn){
return conn.query("SELECT name FROM users");
}).then(function(users){
// connection released here
});
处理器模式的用户示例是 sequelize and knex(书架的查询生成器)。也可以将它用于更简单的事情,例如在所有 AJAX 请求完成时隐藏加载程序。