理解 Promise Disposer 模式
您已经在代码中遇到了 Promise Disposer 模式,但它的用途仍然难以捉摸。本文旨在阐明这个概念并演示其应用。
问题概述
在您的代码片段中:
<code class="javascript">function getDb() { return myDbDriver.getConnection(); } var users = getDb().then(function (conn) { return conn.query("SELECT name FROM users").finally(function (users) { conn.release(); }); });</code>
您面临的问题如果您忽略在每次 getDb 调用后释放数据库连接,则会导致潜在的资源泄漏。如果超出资源限制,这可能会导致系统冻结。
介绍 Disposer 模式
Promise 处理程序模式在代码范围与其资源之间建立了牢固的连接拥有。通过将资源绑定到范围,您可以确保在范围结束时及时释放资源,从而消除监督风险。此模式与 C# 的 using、Python 的 with、Java 的 try-with-resource 和 C 的 RAII 具有相似之处。
模式结构
处置器模式遵循特定的结构:
<code class="javascript">withResource(function (resource) { return fnThatDoesWorkWithResource(resource); // returns a promise }).then(function (result) { // resource disposed here });</code>
将其应用到您的代码
通过将代码重构为处置器模式:
<code class="javascript">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(); }); }</code>
您现在可以重写您之前的代码为:
<code class="javascript">withDb(function (conn) { return conn.query("SELECT name FROM users"); }).then(function (users) { // connection released here });</code>
确保资源在finally块内释放,以保证正确处置。
真实示例
实践中处理程序模式的著名示例包括 Sequelize 和 Knex(Bookshelf 的查询生成器)。其应用程序扩展到管理复杂的异步流程,例如根据多个 AJAX 请求的完成情况显示和隐藏加载指示器。
以上是什么是 Promise Disposer 模式及其工作原理?的详细内容。更多信息请关注PHP中文网其他相关文章!