Ich bin auf der Suche nach einem Weg, um eine bestimmte Aufgabe zu erfüllen, und das ist, vonVermeidung .call() und .apply() mit .bind()
gingjQuery.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
gehenwhen(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/
'.bind ($ .when, null)'? – Raynos
@Raynos: Yay, reiben Sie das Salz in mein verletztes Ego ..: p – jAndy