什么是承诺处理器模式?

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 请求完成时隐藏加载程序。