私が変更できないインタフェース(この場合はマングース)にアクセスしている関数があるとします。インタフェースは、見つかったリソースを渡すという約束を返します。レスポンスをレンダリングするために約束を持った外部インタフェースの引数を扱うためのデザインパターン
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番目の引数として渡すこともできます。
新しい関数リテラルを宣言しなくても、この問題に対処するためのパターンや何かが必要なのは確かです。誰もパターンを提案できますか?このような状況に対処するためのより良い方法はありますか?
は、コールバック地獄とは何の関係もありません:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind
これはparticalアプリケーションとして知られている:
は、より多くの情報のため
bind
のドキュメントを参照してください。約束事に取り組むときにそれらを入れ子にする。クロージャは完全に問題ありません。あなたの問題に対する推奨アプローチです! – Bergi