什么是承诺处理器模式?

时间:2015-03-07 14:04:19

标签: javascript promise dispose bluebird

我已经在几个地方读过有关承诺处理器模式,但我无法弄清楚它是什么。有人建议我在代码中使用它:

function getDb(){
    return myDbDriver.getConnection();
}

var users = getDb().then(function(conn){
     return conn.query("SELECT name FROM users").finally(function(users){
         conn.release();
     });
});

承诺处理程序模式是什么以及它在这里如何应用?


注意 - 在原生承诺中,我将.finally称为"添加拒绝和履行处理程序,它们返回值但执行操作"。如果重要的话,我在这种情况下使用蓝鸟。

1 个答案:

答案 0 :(得分:43)

代码问题

上述方法的问题在于,如果您在每次执行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
 });

处理程序模式的用户示例包括sequelizeknex(书架的查询构建器)。它也可以用于简单的事情,例如在所有AJAX请求完成时隐藏加载器。

蓝鸟

由于您使用的是蓝鸟,因此它内置了专用的Promise.using.disposer功能,让您可以一次性处理/释放多个资源。