Promise Disposer パターンを理解する
非同期プログラミングでは、データベース接続などのリソースを漏洩することなく安全に管理するのは困難な場合があります。 Promise ディスポーザ パターンは、リソースの所有権を実行スコープとリンクすることにより、この問題の解決策として登場します。
コードの問題
提供されたコードは、次のようなシナリオを示しています。 getDb を呼び出すたびに適切に解放されないと、データベース接続がリークする可能性があります。これにより、リソースが枯渇すると、最終的にアプリケーションがフリーズする可能性があります。
ディスポーザー パターン
ディスポーザー パターンは、リソースとそれを利用するコードとの間に厳格な関係を強制します。リソースが特定の実行コンテキストにバインドされている場合、コードの実行が終了すると、リソースを確実に解放できます。これにより、リソース漏洩のリスクが排除されます。その構文は次のようになります。
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 });
利点と使用例
ディスポーザー パターンにより、リソースが適切に解放され、リークが排除されます。 。その実装は Sequelize や Knex などのライブラリで普及しており、その多用途性を示しています。すべての AJAX リクエストが完了した後にローダーを非表示にするなど、他のタスクを制御するために拡張することもできます。
以上がPromise Disposer パターンでリソース リークを防ぐには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。