为了账号安全,请及时绑定邮箱和手机立即绑定

什么是承诺处理器模式?

什么是承诺处理器模式?

jeck猫 2019-08-28 10:08:24
什么是承诺处理器模式?我已经在几个地方读过有关承诺处理器模式,但我无法弄清楚它是什么。有人建议我在代码中使用它,看起来像: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 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

您的代码存在问题

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

你可以在一个地方做:

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

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


处理器模式

处理器模式是将代码范围与拥有资源耦合的一种方式。通过将资源绑定到作用域,我们确保在完成它时始终释放它,并且我们不能轻易忘记释放它。它类似于usingC#,withPython和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内置在功能,让你处理采取/一次你可能要考虑释放多个资源。


查看完整回答
反对 回复 2019-08-28
  • 1 回答
  • 0 关注
  • 330 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号