理解 Promise Disposer 模式
您已经在代码中遇到了 Promise Disposer 模式,但其用途仍然难以捉摸。本文旨在阐明概念并演示其应用。
问题概述
在您的代码片段中:
function getDb() {
return myDbDriver.getConnection();
}
var users = getDb().then(function (conn) {
return conn.query("SELECT name FROM users").finally(function (users) {
conn.release();
});
});
如果您忽略在每次 getDb 调用后释放数据库连接,您将面临潜在的资源泄漏问题。如果超出资源限制,这可能会导致系统冻结。
介绍处置器模式
Promise 处置器模式在代码范围与其资源之间建立了牢固的连接拥有。通过将资源绑定到范围,您可以确保在范围结束时及时释放资源,从而消除监督风险。此模式与 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
});
确保资源在finally块内释放,以保证正确处置。
真实世界示例
值得注意的示例实践中的处理程序模式包括 Sequelize 和 Knex(Bookshelf 的查询生成器)。其应用程序扩展到管理复杂的异步流程,例如根据多个 AJAX 请求的完成情况显示和隐藏加载指示器。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3