ホームページ >ウェブフロントエンド >jsチュートリアル >Promise Disposer パターンでリソース リークを防ぐには?

Promise Disposer パターンでリソース リークを防ぐには?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-18 14:51:03892ブラウズ

How to Prevent Resource Leaks with the Promise Disposer Pattern?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。