2012-04-20 6 views
15

Estoy buscando una manera de llevar a cabo una tarea determinada y que es, al pasar deEvitar .call() y .apply() usando .bind()

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

a

when(promiseArray).done(...) 

Como ya sabrá, .bind() se puede usar para crear algo así como argumentos predeterminados y también para hacer algunas cosas bastante ingeniosas. Por ejemplo, en lugar de llamar siempre

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

podemos hacerlo como

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

Esto es bastante fría (incluso si hay una penalidad de rendimiento invocando .bind() como esto, lo sé y estoy consciente de ello), pero realmente no puedo lograrlo para jQuerys .when llamada. Si tiene una cantidad desconocida de objetos prometedores, por lo general los inserta en una matriz, para luego poder pasarlos a .when como en mi primer fragmento de código anterior.

que estoy haciendo esto hasta ahora:

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

Ahora podemos ir como

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

Esto funciona, pero también quiero para deshacerse de la necesidad de pasar de forma explícita todos los null hora. Así que traté

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

pero que arroja a mí:

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

supongo que estoy sentado sobre esto durante demasiado tiempo y no puedo pensar con claridad más. Parece que hay una solución fácil. No quiero usar ninguna función adicional para resolver este problema, preferiría una solución usando .bind().

Véase un ejemplo completo aquí: http://jsfiddle.net/pp26L/

+1

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

+0

@Raynos: yay, frota la sal en mi ego herido ..: p – jAndy

Respuesta

10

Esto debería funcionar:

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

Usted acaba de unirse (o el curry, si lo prefiere) el primer argumento de .bind y fijarlo a null.

Fiddle.

+0

omg, estoy tan seguro de haberlo hecho en algún momento. ¿Cómo podría extrañarlo? Al menos sabía que era una solución bastante fácil para una gran pregunta. Gracias @Jon! – jAndy

+0

@jAndy: Considerando que tus chuletas JS son mucho mejores que las mías, es obvio que te perdiste debido a la fatiga. Aclamaciones. – Jon

7

bind acepta una cantidad variable de argumentos, por lo que puede aplicar parcialmente un método. Así, en lugar de:

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

Haga lo siguiente:

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

Y jsFiddle actualización: http://jsfiddle.net/pp26L/2/

Cuestiones relacionadas