Promise ディスポーザー パターンを理解する
コード内で Promise ディスポーザー パターンを見つけましたが、その目的はまだわかりません。この記事は、概念を明確にし、その応用例を示すことを目的としています。
問題の概要
コード スニペット内:
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