什么是承诺处理器模式?

我已经读了几个地方的承诺处理器模式,但我不知道它是什么。 有人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函数内置,让你处理/释放多个资源,你可能要考虑。