gpt4 book ai didi

javascript - 什么是 promise 处理器模式?

转载 作者:IT王子 更新时间:2023-10-29 03:11:37 28 4
gpt4 key购买 nike

我在好几个地方都读到过 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 处理器模式,它如何应用到这里?


注意 - 在 native promise 中,我将 .finally 填充为“添加返回值但执行操作的拒绝和实现处理程序”。如果重要的话,我在这种情况下使用 Bluebird 。

最佳答案

你的代码有问题

上述方法的问题在于,如果您在每次执行 getDb 后都忘记释放连接,您就会发生资源泄漏,最终可能会在应用程序耗尽资源时卡住您的应用程序正在泄漏。

你可以在一个地方做:

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

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


处理器模式

处置器模式是一种将代码范围与拥有资源相结合的方法。通过将资源绑定(bind)到一个范围,我们确保它在我们使用完后总是被释放,并且我们不会轻易忘记释放它。它类似于 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
});

disposer 模式的用户示例是 sequelizeknex (书架的查询生成器)。也可以将它用于更简单的事情,例如在所有 AJAX 请求完成时隐藏加载程序。

关于javascript - 什么是 promise 处理器模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28915677/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com