理解 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