什么是承诺处理器模式?
我已经读了几个地方的承诺处理器模式,但我不知道它是什么。 有人build议我在代码中使用它,如下所示:
function getDb(){ return myDbDriver.getConnection(); } var users = getDb().then(function(conn){ return conn.query("SELECT name FROM users").finally(function(users){ conn.release(); }); });
什么是承诺处理器模式,它在这里如何适用?
注意 – 在本地的承诺中,我.finally
“添加拒绝和履行处理程序,返回价值,但执行一个行动”。 在这种情况下,我正在使用蓝鸟。
你的代码的问题
上述方法的问题是,如果您在每次执行getDb
后都忘记释放连接,那么当资源泄漏时,最终可能会冻结您的应用程序。
你可能在一个地方做:
var users = getDb().then(function(conn){ return conn.query("SELECT name FROM users"); });
这将泄漏从未closures的数据库连接。
处置者模式
disposer模式是一种将代码范围与拥有资源的方法。 通过将资源绑定到一个范围,我们确保它在我们完成后始终被释放,并且我们不能轻易忘记释放它。 它类似于在C#中using
,在Python中使用Java,而在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和knex (书架的查询生成器)。 当所有AJAX请求都完成时,也可以使用它来执行简单的操作,例如隐藏加载器。
知更鸟
由于您使用的是蓝鸟,它有专门的Promise.using
和.disposer
函数内置,让你处理/释放多个资源,你可能要考虑。