2012-04-20 12 views
15

私は、特定のタスクを達成するための方法を探していますし、それは.bind使用.applyは.call()と()の回避()

when(promiseArray).done(...) 

jQuery.when.apply(null, promiseArray).done(...) 

行くから、あります

ご存知のように、.bind()は、デフォルトの引数のようなものを作成したり、かなり面白いものを作成したりすることができます。たとえば、代わりに常にこれは、(このような.bind()を呼び出すパフォーマンスpenalityがあっても、私はそれを知っていると私はかなりクールです

var toStr = Function.prototype.call.bind(Object.prototype.toString); 
toStr([]) // [object Array] 

のように、我々はそれを行うことができます

var toStr = Object.prototype.toString; 
// ... 
toStr.call([]) // [object Array] 

を呼び出しますそれを意識して)、私は実際にjQuerys .whenコールのためにそれを達成することはできません。未知の量の約束オブジェクトがある場合は、それらを通常配列にプッシュし、それらを上記の最初のコードスニペットのように.whenに渡せるようにします。私はこれまでのところ、これをやっている

:今、私たちは

when(null, promiseArray).done(...) 

のように行くことができます

var when = Function.prototype.apply.bind($.when); 

これは動作しますが、私はまた、明示的にすべてのnullに合格する必要を取り除きたいです時間。だから私は

var when = Function.prototype.apply.bind($.when.call.bind(null)); 

を試してみましたが、それは私にスロー:

"TypeError: Function.prototype.apply called on incompatible null" 

私は今、あまりにも長い間、この上に座ってると思うともうストレート考えることはできません。それは簡単な解決策があるように感じる。 私はこの問題を解決するために追加機能を使用したくないので、私は絶対に.bind()を使って解決策を選ぶことを勧めます。 http://jsfiddle.net/pp26L/

+1

'.bind($ .when、ヌル)'

var when = Function.prototype.apply.bind($.when); 

これを行いますか? – Raynos

+0

@レイノス:ええ、私の負傷した自我に塩をこする。:p – jAndy

答えて

10

これは動作するはずです::(ご希望の場合、またはカレー)

when = Function.prototype.apply.bind($.when, null); 

あなただけバインド.bindの最初の引数とnullにそれを修正

は、ここに完全な例を参照してください。

Fiddle

+0

omg、私はある時点でそれをしたと確信しています。どうすればそれを見逃すことができますか?少なくとも私はそれが大きな問題のためにかなり簡単な解決策であることを知っていました。ありがとう@ジョン! – jAndy

+0

@jAndy:あなたのJSのチョップが私のものよりもはるかに優れていることを考慮すると、疲労のためにそれを逃したことは明らかです。乾杯。 – Jon

7

bindは、可変数の引数を受け入れるので、メソッドを部分的に適用できます。だから、代わりに:

var when = Function.prototype.apply.bind($.when , null); 

そして更新jsfiddle:http://jsfiddle.net/pp26L/2/

関連する問題