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 呼び出しのたびにデータベース接続を解放しなかった場合に発生する可能性のあるリソース リークの数を減らします。これにより、リソース制限を超えるとシステムがフリーズする可能性があります。
ディスポーザ パターンの紹介
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 中国語 Web サイトの他の関連記事を参照してください。