2016-04-08 10 views
0

私が変更できないインタフェース(この場合はマングース)にアクセスしている関数があるとします。インタフェースは、見つかったリソースを渡すという約束を返します。レスポンスをレンダリングするために約束を持った外部インタフェースの引数を扱うためのデザインパターン

show = function(response) { 
    Resource.findById(req.params.id).then(renderResource); 
} 

function renderResource(resource) { 
    // render the response 
} 

、私はshow関数からresponseパラメータへのアクセスを持っている必要があります。私はbind関数を使ってこれを得ることができ、thisをハイジャックして応答変数にすることができます。

show = function(response) { 
    Resource.findById(req.params.id).then(renderResource.bind(response)); 
} 

function renderResource(resource) { 
    this.send(resource); 
} 

しかし、別の引数をrenderResource関数に渡したい場合はどうすればよいですか?私がそれをやり遂げた唯一の方法は、このようなものです。

show = function(response) { 
    Resource.findById(req.params.id).then(function(resource) { 
    renderResource.call(response, resource, "foo")); 
    } 
} 

function renderResource(resource, otherArg) { 
    this.send(resource); 
    //do something with otherArg 
} 

しかし、この時点で私はもはやコードに満足していません。

  • 私は関数リテラルを宣言しなければならず、コールバック地獄に向かっています。
  • 私はまだcallを使用していますので、まだ関数内でthisを使用することができますが、これまでのところ私たちはこれまでのところ、responseを3番目の引数として渡すこともできます。

新しい関数リテラルを宣言しなくても、この問題に対処するためのパターンや何かが必要なのは確かです。誰もパターンを提案できますか?このような状況に対処するためのより良い方法はありますか?

+1

は、コールバック地獄とは何の関係もありません:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

これはparticalアプリケーションとして知られている:

show = function(response) { Resource.findById(req.params.id) .then(renderResource.bind(null, response, "foo")); } function renderResource(response, otherArg, resource) { response.send(resource); //do something with otherArg } 

は、より多くの情報のためbindのドキュメントを参照してください。約束事に取り組むときにそれらを入れ子にする。クロージャは完全に問題ありません。あなたの問題に対する推奨アプローチです! – Bergi

答えて

2

bindに必要な数の引数を渡すことができます。混乱を避けるために引数を渡す手段としてthisを使用することは避けています。あなたが持っていない - 関数リテラルを使用して
https://en.wikipedia.org/wiki/Partial_application

+0

ありがとう、魅力的な作品 –

関連する問題