約束の処理者パターンは何ですか?

What is the promise disposer pattern?


質問 written by Benjamin Gruenbaum @2015-06-29 14:32:39Z

: 37 : 1 : 4

私はいくつかの場所でプロミスディスポーザパターンについて読んだことがありますが、それが何であるか私は理解できません。 私はそれを次のようなコードで使うことを勧めました:

function getDb(){
    return myDbDriver.getConnection();
}

var users = getDb().then(function(conn){
     return conn.query("SELECT name FROM users").finally(function(users){
         conn.release();
     });
});

約束のディスポーザパターンとは何ですか?また、それはどのように適用されますか?


注 - 本来の約束では、私は.finallyに「値を返すがアクションを実行する拒絶ハンドラと履行ハンドラの両方を追加する」と.finallyします。 それが問題であれば私はこの場合bluebirdを使用しています。

コメント 1

わずかに関連しているstackoverflow.com/questions/22521329/..しかし重複しない

written by Sterling Archer @2015-03-10 21:17:09Z

回答 1 written by Bergi @2015-06-29 16:30:20Z
43

あなたのコードの問題

上記のアプローチの問題点は、 getDbを実行するたびに接続の解放を忘れた場合、リソースリークが発生し、リークしているリソースが不足するとアプリケーションがフリーズする可能性があることです。

あなたは、一箇所でするかもしれません:

var users = getDb().then(function(conn){
     return conn.query("SELECT name FROM users");
});

これは決して閉じられなかったデータベース接続をリークするでしょう。


ディスポーザパターン

ディスポーザパターンは、コードの範囲をリソースの所有と結び付ける方法です。 リソースをスコープにバインドすることで、リソースを使い終わったときに必ず解放されるようにし、解放することを忘れないようにします。 C#でのwith 、Pythonでの使用、Javaでのtry-with-resource、C ++でのRAIIのusingに似ています。

それはように見えます:

It looks like:

ここでそれを適用する

コードを次のように書いたとします。

Applying it here

上記のコードを次のように書くことができます。

If we wrote our code as:

ディスポーザパターンのユーザーの例としては、 sequelizeknex (本棚のクエリービルダー)があります。 たとえば、すべてのAJAXリクエストが完了したときにローダーを隠すなど、より単純なことにも使用できます。

青い鳥

bluebirdを使っているので、 Promise.using.disposer専用の関数が組み込まれているので、検討したいと思うかもしれない複数のリソースを一度に取得/解放することができます。

コメント 1

あなたのディスポーザパターンと比較するために、 Promise.using使用例がありますか。

written by フロリアン・マーガイン @2015-03-10 07:55:14Z

コメント 2

これがif (_db)欠いていませんか?getConnectionが失敗した場合、 withDb()は現在「未定義では解放できません」というエラーで拒否します。

written by @2015-06-29 16:25:38Z

コメント 3

@Bergi getConnectionが失敗した場合は( 接続プールデータベースの接続が失敗し、データベースに対する操作ではないため)アプリをクラッシュさせて書き込みを行いたいと思いますが、私はそれを明確にするべきです。

written by Benjamin Gruenbaum @2015-06-29 16:26:57Z

コメント 4

ええ、あなたはおそらくクラッシュしたいと思うでしょう、しかし接続性の問題を述べる正しい例外を除いて:-)

written by Bergi @2015-06-29 16:31:12Z

コメント 5

これは安全ですか?2つのwithDb()呼び出しがすばやく連続して行われたとします。2つの接続は完全に独立していますか?そうでない場合は、両方の要求が満たされたときにのみどちらかの接続が解放されるメカニズムが必要になるかもしれません。

written by Roamer-1888 2015年 @2015-07-01 02:47:46Z