一尘不染

什么是承诺处理器模式?

javascript

我已经在多个地方阅读了诺言处理程序模式,但我不知道它是什么。建议我在如下代码中使用它:

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

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

什么是Proposal Disposer模式,在这里如何应用?


注意-在本机的Promise中,我.finally做为“添加返回值但执行操作的拒绝和实现处理程序”。在这种情况下,我会使用蓝鸟。


阅读 300

收藏
2020-05-01

共1个答案

一尘不染

您的代码有问题

上述方法的问题在于,如果您在每次执行操作后都忘记释放连接getDb,则可能会导致资源泄漏,当应用程序耗尽资源时,该应用程序最终可能会冻结。

您可以在一处做:

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

这将泄漏从未关闭过的数据库连接。


处理器模式

分配器模式是一种将代码范围与拥有资源耦合的方式。通过将资源绑定到作用域,我们确保在完成处理后始终将其释放,并且我们不能轻易忘记释放它。它类似于usingC#with中的Python和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和knex(书架的查询生成器)。例如,还可以将其用于更简单的操作,例如在完成所有AJAX请求后隐藏加载程序。

bluebird

由于您正在使用bluebird,因此它具有专用功能Promise.using.disposer内置功能,可让您立即处理可能需要考虑的多个资源。

2020-05-01