14 agosto 2012

Jugando con jQuery Deferred


El objeto Deferred es una característica poco conocida de jQuery que permite escribir menos código. Veamos como aprovecharlo.

Todas las funciones AJAX en jQuery retornan un Deferred, y por lo tanto:

$.ajax({url:'/api/users', success:function(d){console.log(d)}});

se puede escribir como:

$.ajax({url:'/api/users'}).done(function(d){console.log(d)})

El cambio es sutil pero simplifica algunos casos engorrosos. Por ejemplo esperar el resultado de multiples llamadas AJAX:

var usersRequest = $.get('/api/users');
var settingsRequest = $.get('/api/settings');

jQuery.when(usersRequest, settingsRequest).done(function (users, settings) {
    console.log(users);
    console.log(settings);
});


O simplificar código mediante null objects:

var request = (shouldUpdate) ? $.post('/api/user', userData) 
                             : jQuery.Deferred().resolve();
request.done(function() { doSomething() });

04 abril 2012

Amber Smalltalk

Después de mucho tiempo volvi a ver el blog de James Robertson, donde me encontre con Amber Smalltalk: una implementación de Smalltalk hecha en JavaScript.

Seguramente la pregunta práctica es: ¿A quien le puede interesar interpretar Smalltalk con JavaScript?

Más alla de la respuesta obvia de: a los fanáticos de Smalltalk; hay algunos buenos casos donde Amber resulta interesante:

<modalidad-fanatico-smalltalk>
  • Enseñanza: Uno puede incrustar un classbrowser junto con una pagina tutorial, y usarlo para dar clases de programación orientada a objetos: los alumnos solo necesitan un browser.
  • Producción: Si existiesen las herramientas apropiadas, uno podría usar un entorno de objetos para desarrollar y luego exportar todo a un JavaScript minimizado y listo para usar con NodeJS o en un browser. (El gran obstáculo: las diferencias de sintaxis JavaScript/Smalltalk, JObjectProxy luce feo para quienes están acostumbrados al encadenamiento de mensajes en jQuery o el syntax sugar de CoffeScript).
</modalidad-fanatico-smalltalk>

De vuelta en mi modalidad realista.

Por ahora es un lindo experimento para ver, que demuestra una vez más como JavaScript se esta convirtiendo en el "assembler" de la web. 

Hay dos características de Smalltalk que lo convierten en un lenguaje unico, y son también su maldición:
  1. El "ambiente de objetos". Para que cualquiera que haya trabajado un tiempo considerable con Smalltalk volver a los archivos y las herramientas de build es como volver a la pre-historia.
    Sin embargo es una maldición por que aparta al lenguaje de todo el resto del mundo: usar herramientas existentes de versionado o editores comunes se vuelve doloroso y poco práctico.
  2. La sintaxis de message keywords es una camino de ida :)  y es una de las cosas que más extraño en otros lenguajes orientados a objetos: realmente ayuda a pensar en términos de objeto/mensaje.
    El lado negativo es que la diferencia de sintaxis complica la interoperabilidad con lenguajes tipo C como JavaScript.
    Creo que en este sentido los smalltalkers fueron muy conservadores: la sintaxis de Smalltalk es uniforme y genera cierto orgullo. Orgullo que debería dejarse de lado: las características menos elegantes de Groovy o Ruby resultan mucho más prácticas.
Mientras tanto voy observando la evolución de Dart, quien sabe quizas con sus snapshots logre lo que Smalltalk no pudo: lograr una tregua entre el ambiente de objetos y las herramientas basadas en archivos.