2012-04-20 7 views
15

Ich bin auf der Suche nach einem Weg, um eine bestimmte Aufgabe zu erfüllen, und das ist, vonVermeidung .call() und .apply() mit .bind()

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

zu

when(promiseArray).done(...) 

Wie Sie vielleicht wissen, kann .bind() sich daran gewöhnen, etwas wie Standard-Argumente zu erstellen und auch einige ziemlich nette Sachen zu tun. Zum Beispiel, statt immer

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

nennen wir es wie tun können

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

Dieser ziemlich kühl ist (auch wenn es eine Leistung penality ist .bind() wie dieser Aufruf, ich weiß es, und ich bin bewusst, aber ich kann es nicht wirklich für jQuerys .when Anruf erreichen. Wenn Sie eine unbekannte Menge an Versprechungsobjekten erhalten haben, schieben Sie diese normalerweise in ein Array, um dann diese in .when wie in meinem ersten Code-Snippet oben übergeben zu können.

Ich tue dies so weit:

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

Jetzt können wir wie

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

Dies funktioniert, aber ich möchte auch von der Notwendigkeit, um loszuwerden, in null ausdrücklich jede passieren Zeit. Also habe ich versucht

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

aber das wirft mich an:

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

Ich glaube, ich über diese sitze jetzt zu lange und denken kann, nicht mehr gerade. Es fühlt sich an, als gäbe es eine einfache Lösung. Ich möchte keine zusätzliche Funktion verwenden, um dieses Problem zu lösen, ich würde absolut eine Lösung mit .bind() bevorzugen.

Sehen Sie ein vollständiges Beispiel hier:

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

Sie haben soeben binden (oder Curry, wenn Sie bevorzugen) das erste Argument von .bind und es null beheben: http://jsfiddle.net/pp26L/

+1

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

+0

@Raynos: Yay, reiben Sie das Salz in mein verletztes Ego ..: p – jAndy

Antwort

10

Diese funktionieren sollte.

Fiddle.

+0

omg, ich bin mir so sicher, dass ich das irgendwann gemacht habe. Wie könnte ich es vermissen? Zumindest wusste ich, dass es eine ziemlich einfache Lösung für eine große Frage war. Danke @Jon! – jAndy

+0

@jAndy: Wenn man bedenkt, dass Ihre JS Koteletts sind viel besser als meine, es ist offensichtlich, dass man es aufgrund von Ermüdung verpasst. Prost. – Jon

7

bind akzeptiert eine variable Anzahl von Argumenten, sodass Sie eine Methode teilweise anwenden können. Anstatt also:

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

tun:

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

und aktualisiert jsfiddle: http://jsfiddle.net/pp26L/2/