2012-04-20 13 views
15

Szukam sposobu, aby wykonać daną czynność, a to znaczy, przechodząc odUnikanie .Połączenia() i() używając .apply .bind()

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

do

when(promiseArray).done(...) 

Jak być może wiesz, .bind() może przyzwyczaić się do stworzenia czegoś w stylu domyślnych argumentów, a także zrobić całkiem niezłe rzeczy. Na przykład, zamiast zawsze dzwoni

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

możemy to zrobić jak

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

Jest dość chłodno (nawet jeśli nie jest karalność wydajność powołując .bind() tak, wiem o tym i jestem świadomy tego), ale naprawdę nie mogę tego zrobić dla połączenia jQuerys .when. Jeśli masz nieznaną liczbę obietnic, zazwyczaj przesuwasz je do tablicy, aby następnie przekazać je do .when, tak jak w moim pierwszym fragmencie kodu powyżej.

robię to do tej pory:

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

Teraz możemy iść jak

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

To działa, ale chcę też, aby pozbyć się konieczności przechodzić w null wyraźnie każdy czas. Dlatego starałem

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

jednak, że rzuca się na mnie:

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

Chyba Siedzę nad tym zbyt długo i nie mogę myśleć już. Wydaje się, że istnieje proste rozwiązanie. Nie chcę używać żadnej dodatkowej funkcji w celu rozwiązania tego problemu, zdecydowanie wolałabym rozwiązanie z użyciem .bind().

Zobacz pełny przykład tutaj: http://jsfiddle.net/pp26L/

+1

'.bind ($ .Przy, null)'? – Raynos

+0

@Raynos: yay, pocierać sól do mojego zranionego ego ..: p – jAndy

Odpowiedz

10

To powinno działać:

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

Wystarczy powiązać (lub curry, jeśli wolisz) pierwszy argument .bind i przymocować go do null.

Fiddle.

+0

omg, jestem pewien, że zrobiłem to w pewnym momencie. Jak mogłem tęsknić? Przynajmniej wiedziałem, że to dość łatwe rozwiązanie na wielkie pytanie. Dzięki @ Jon! – jAndy

+0

@jAndy: Biorąc pod uwagę, że twoje kotlety JS są znacznie lepsze niż moje, oczywiste jest, że przeoczyłeś je z powodu zmęczenia. Twoje zdrowie. – Jon

7

akceptuje zmienną liczbę argumentów, dzięki czemu można częściowo zastosować metodę. Tak więc, zamiast:

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

Wykonaj:

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

i aktualizowane jsfiddle: http://jsfiddle.net/pp26L/2/