理解 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中文網其他相關文章!