当前位置: 首页 > 面试题库 >

什么是承诺处理器模式?

松增
2023-03-14
问题内容

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

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做为“添加返回值但执行操作的拒绝和实现处理程序”。在这种情况下,我会使用蓝鸟。


问题答案:

您的代码有问题

上述方法的问题在于,如果您在每次执行操作后都忘记释放连接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内置功能,可让您立即处理可能需要考虑的多个资源。



 类似资料:
  • 问题内容: 我正在尝试用正确的方法表示正确的方法,以指示内发生故障。 如果诺言没有失败,(即返回诺言的操作是否正常工作,例如返回状态200的AJAX请求),但是我认为结果无效,通常我会这样做弹出窗口,向用户说明问题,然后执行“返回假”;尽早退出该方法。 但是,有了承诺,如果我想从.then()内部做类似的事情,我就被引导去相信我应该做的是抛出一个错误,而应该让它被.catch()抓住。 ),我已经

  • 问题内容: 作为节点程序员。我习惯于使用“ nodebacks”来处理代码中的错误: 编写该函数时,我可以执行以下操作: 我如何用promises处理这种错误? 问题答案: 经验法则 每当您对如何使用Promise有所疑问时,请考虑一下同步版本。 至少对我来说,这比第一个参数有时是的回调要干净得多。 promises方式几乎总是与问题的同步版本非常相似: 使用回调函数时,myFn看起来像什么: 使

  • 问题内容: 我使用ES6 Promises来管理我的所有网络数据检索,并且在某些情况下需要强制取消它们。 基本上,这种情况是这样的:我在UI上进行了预先输入搜索,在该UI中,将请求委派给后端必须基于部分输入执行搜索。尽管此网络请求(#1)可能需要一点时间,但用户继续输入,最终会触发另一个后端调用(#2) 这里#2自然优先于#1,因此我想取消Promise包装请求#1。我已经在数据层中缓存了所有Pr

  • 问题内容: 我对诺言仍然还很陌生,目前正在使用蓝鸟,但是在我不确定如何最好地处理它的情况下。 因此,举例来说,我在Express应用程序中有一个Promise链,如下所示: 所以我的行为是: 通过ID获取帐户 如果此时存在拒绝,请炸开并返回错误 如果没有错误,则将文档转换为模型 使用数据库文档验证密码 如果密码不匹配,则炸开并返回其他错误 如果没有错误,请更改密码 然后返回成功 如果有其他问题,请

  • 问题内容: 我对诺言仍然相当陌生,并且目前正在使用蓝鸟,但是在我不确定如何最好地处理它的情况下。 因此,例如,我在快速应用程序中有一个promise链,如下所示: 所以我的行为是: 通过ID获取帐户 如果此时存在拒绝,请炸毁并返回错误 如果没有错误,则将文档转换为模型 使用数据库文档验证密码 如果密码不匹配,则炸开并返回其他错误 如果没有错误,请更改密码 然后返回成功 如果还有其他问题,请返回50

  • 问题内容: 我正在开发Angular 6应用程序,并且被告知以下内容是反模式: 我意识到等待承诺链毫无意义。如果someFunction()返回Promise,则在等待时不需要Promise链。你可以这样做: 但是有人告诉我,等待一个诺言链可能会导致错误,或者会破坏我的代码。如果上面的第一个代码段与第二个代码段执行相同的操作,那么使用哪个代码段有什么关系呢。第一段不会引入第二段带来的危险? 问题答