Evitare .call () e .apply () usando .bind ()

Sto cercando un modo per compiere un certo task e cioè che va

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

a

 when( promiseArray ).done(...) 

Come potreste sapere, .bind() può abituarsi a creare qualcosa come gli argomenti predefiniti e anche fare qualche cosa abbastanza nifty. Ad esempio, invece di call sempre

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

possiamo farlo come

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

Questo è abbastanza freddo (anche se c'è una penalità di performance che invoca .bind() come questo, lo so e lo sono a conoscenza), ma non posso davvero farlo per jQuerys .when chiama. Se hai una quantità sconosciuta di oggetti promise, spingerai di solito in una matrix, quindi potrai passarli in .when come nel primo frammento di codice di cui sopra.

Sto facendo finora:

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

Ora possiamo andare come

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

Questo funziona, ma voglio anche sbarazzarsi della necessità di passare null esplicitamente each volta. Così ho provato

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

ma che mi getta:

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

Immagino che sto seduto sopra questo per troppo tempo e non riesco più a pensare più a fondo. Sembra che ci sia una soluzione facile. Non voglio usare alcuna function aggiuntiva per risolvere questo problema, avrei assolutamente preferito una soluzione utilizzando .bind() .

Vedere un esempio completo qui: http://jsfiddle.net/pp26L/

Questo dovrebbe funzionare:

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

È sufficiente bind (o curry, se preferisci) il primo argomento di .bind e correggerlo a null .

Fiddle .

bind accetta un numero variabile di argomenti, in modo da poter applicare parzialmente un metodo. Quindi, invece di:

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

Fai questo:

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

E aggiornato jsfiddle: http://jsfiddle.net/pp26L/2/