2011-10-10 14 views
7

Tome un vistazo a this JsFiddle:¿Cómo reducir la frecuencia de tales errores en mi código?

var requests = [ 
    $.ajax("http://search.twitter.com/search.json", { data: { q: 'ashishnjain' }, dataType: 'jsonp' }) 
    .done(function() {console.log("request");}), 

    $.ajax("http://search.twitter.com/search.json", { data: { q: 'ashishnjain' }, dataType: 'jsonp' }) 
    .done(function() {console.log("request");}) 
]; 

$.when(requests).done(console.log("alldone")); 

El resultado esperado es: request request alldone, pero en realidad esto imprime alldone request request.

En realidad, hay dos errores en este código (lo dejo como ejercicio si disfrutas de ese tipo de cosas), pero finalmente creo que esto ocurre porque JavaScript y jQuery son extremadamente indulgentes cuando se dan argumentos que no tienen sentido alguno. En este entorno, lo "correcto" parece ser "hacer algo o nada, ¡simplemente no arrojar un error!".

En vista de que este código pasa JSLint, y sólo me ha costado un par de horas de depuración (el código real era, por supuesto, algunos órdenes de magnitud más complejo), me pregunto qué más puedo hacer para reducir el tiempo perdido en tal indulgencia injustificada. Este no es un ejemplo aislado; parece suceder una y otra vez ¿Alguna sugerencia?

+0

Según usted, los argumentos no tienen sentido. De acuerdo con el motor, estoy seguro de que lo hacen. ¿Qué errores esperarías de tus "errores"? Algo así como "argumento inválido"? – bzlm

+0

@bzlm Me encantaría discutir eso, pero me temo que esto desviará la pregunta. No puedo cambiar JavaScript, y no puedo cambiar jQuery (mucho), así que me pregunto cómo evitar cosas como esta. –

+1

Siento tu dolor. Es increíble lo popular que es este estilo de programación propenso a errores. Apenas pasa un día sin que tenga que navegar a través de mi propio código JS y mirar cada detalle de la sintaxis más sutil, para encontrar errores que un compilador adecuado encontraría y marcaría en una fracción de segundo. No sé cómo otras personas disfrutan de esta experiencia frustrante, pero como lo hagan, no pueden ser muy productivos de esa manera. – Timwi

Respuesta

0

parece que confundió

$.when([x,y]) 

para

$.when(x,y) 

No creo que hay una herramienta de análisis por ahí que le ayudará a atrapar a este tipo de error, ya que es perfectamente aceptable para pasar una lista para cuando. Si usted quiere tener una función más restrictiva puede hacer uno mismo:

function whenForMoreThanOne(list_of_deferreds){ 
    return $.when.apply($, list_of_deferreds); 
} 
3

Es realidad, es posible check types en tiempo de ejecución en Javascript, es sólo que ser estricto no es el estilo preferido en Javascript. A los hackers de JS les gusta colgarlo.

Otros hackers lidian con esto, ¿no? Entonces, en lugar de echarle la culpa al lenguaje o jQuery por sus largas horas dedicadas a la depuración de este problema, sugeriría en cambio que investigue otras formas de reducir sus esfuerzos de depuración.

Aquí hay un par de sugerencias que se me ocurre:

  1. prueba a cabo pequeñas piezas de código en la consola interactiva JS primero antes de pegarlo en el archivo .js: este
    • que permite rápidamente iterar hasta que salga bien (¿Cómo se utiliza .cuando $()?)
    • asegura que cuando no se hace bien, a comprender cómo utilizar la API de
  2. Mantenga espárrago ying JS, y sigue escribiendo más. El segundo error que cometió: no envolvió console.log ("todo listo") en una función, muestra que un concepto fundamental sobre JS aún no se ha establecido completamente en su lugar: un hacker experimentado de JS nunca cometería ese error.
+0

'" un hacker experimentado de JS nunca cometería ese error "- ¿Qué tan seguro estás de esto? Puedes decir esto solo porque no podemos mirar tu pantalla todo el tiempo. Si alguien te viera cometer un error similar en JS, incluso una vez, parecerías un gran hipócrita. – Timwi

+1

La comprobación de tipos solo protegerá contra errores de tipo. El error de OP no es en realidad un error de tipo (y más una cuestión de $ .when tener una API desordenada) – hugomg

+2

El error de OP * es * en realidad un error de tipo (al menos, el de no envolver 'console.log' sería revelado por verificación de tipo). Soy un hacker experimentado de JS y cometo ese error una vez cada dos semanas. – Malvolio

1

En el caso de su error más prominente, la respuesta puede decirse en dos palabras: static typing. La tipificación estática no resuelve todos los problemas, pero genera una gran parte del trabajo que implica rastrear estos fallos sutiles.

Las desventajas de los tipos estáticos son no, como reclamos missingno, tienen algo que ver con hacer la programación más difícil o menos poderosa o algo por el estilo. El mayor problema es que la fuerza del sistema de tipeo de un idioma parece variar inversamente con la popularidad del idioma. Los lenguajes tipeados muy bien tipados como Scala y Haskell aún se encuentran en el nivel boutique de aceptación. Java es mucho más popular, pero su sistema de tipos es difícil de usar y está lleno de agujeros; algo similar se puede decir de C#. El sistema de tipos del PHP inmensamente popular golpearía a un observador neutral como un sabotaje deliberado. Los lenguajes antiguos como FORTAN y C ni siquiera lo intentan.

No sé por qué ocurre esto, pero estoy convencido de que la explicación obvia - a las personas no les gusta el tipado fuerte - no es correcta.

Un problema relacionado es que aún no puede compilar cualquier lenguaje fuertemente tipado con JavaScript. El enfoque más cercano es probablemente GWT.

+0

La indecidibilidad del problema de detención garantiza que hay programas no tipificados que no se pueden verificar estáticamente por un compilador por lo que técnicamente los tipos estáticos son una limitación: P Pero sí, creo que tiene razón al identificar que Haskell también me ha hecho exigente cuando se trata de sistemas tipo. – hugomg

+0

@missingno: Esto no tiene nada que ver con el problema de detención. No necesita un sistema de tipo Turing completo para expresar cualquier programa. Si necesita una verificación de tipo relajada, siempre puede usar el 'objeto' de tipo uber. Además de eso, C# incluso tiene el tipo "dinámico", que se parece mucho a lo que quieres. Con esto, el tipado estático es una característica adicional además de lo que un lenguaje sin tipo puede proporcionar, y no quita nada. (En la práctica, encuentro que el tipo "dinámico" rara vez es útil.) – Timwi

+0

@Timwi: Tenía la esperanza de que la cara sonriente tonta hubiera dejado en claro que era un comentario obviamente exagerado. – hugomg

Cuestiones relacionadas