En un simple sitio web basado en Ajax estamos haciendo algunas peticiones HttpRequests de forma síncrona (me doy cuenta de que "Ajax sincrónico" es algo así como un oxímoron). La razón principal por la que esto se realiza de forma síncrona o asíncrona es para simplificar el modelo de programación para algunos de los involucrados (historia larga).Force UI repintado en Webkit (Safari y Chrome) justo antes de la solicitud Synchronous "Ajax"
De todos modos, queremos poder realizar un cambio de estilo (específicamente, superponer la pantalla con blanco semitransparente como lo hace la búsqueda de Google) justo antes de realizar la solicitud y luego quitarla cuando vuelvan los resultados. Básicamente, esto se parece a:
load:function(url) {
....
busyMask.className="Shown"; //display=block; absolute positioned full screen semi-transparent
var dta=$.ajax({type:"GET",dataType:"json",url:url,async: false}).responseText;
busyMask.className="Hidden"; //sets display=none;
...
return JSON.parse(dta);
}
Es bien sabido unas peticiones síncronas cierran la interfaz de usuario. Así que no es sorprendente que la capa blanca nunca aparezca en Safari y Chrome (lo hace de forma interesante en Firefox). He intentado ralentizar la respuesta hacia abajo y usar una superposición de color rosa para que sea dolorosamente obvio, pero simplemente no actualizará la interfaz de usuario hasta que se complete la solicitud. Dejar la parte 'busyMask.className = "Hidden"' mostrará la máscara, pero solo después de que se complete la solicitud de ajax.
he visto muchos muchos trucos para forzar la interfaz de usuario para volver a pintar (por ejemplo Why HourGlass not working with synchronous AJAX request in Google Chrome?, http://ajaxian.com/archives/forcing-a-ui-redraw-from-javascript), pero todos ellos parecen estar en conjunción con el intento de mostrar las actualizaciones reales "permanentes" DOM o de estilo, no con mostrar temporalmente una cambio de estilo mientras se realiza una solicitud sincrónica.
Entonces, ¿hay alguna manera de hacer esto o estoy luchando una batalla perdida? Puede ser que solo tengamos que pasar a solicitudes asincrónicas caso por caso para las solicitudes con peores resultados, lo que podría ser una forma decente para abordar el problema de la curva de aprendizaje ... Pero espero que haya un afuera la caja de respuesta aquí.
"Ignoraré la justificación" - gracias, lo agradezco. Voy a digerir su respuesta en detalle pronto y ver si puedo aplicarlo a lo que estamos haciendo ... – jlarson
Desafortunadamente, este enfoque no me va a ayudar porque todavía es esencialmente asincrónico: el código para manejar el éxito está desarticulado del código. eso hace la solicitud He agregado algunas aclaraciones en el bloque de código en mi publicación para ayudar a aclarar eso. Una vez más, dense cuenta de que esto no es en absoluto la mejor práctica ...pero manejar la respuesta en una función separada desde donde se realizó la solicitud puede ser demasiado engorroso para algunas personas – jlarson
También me gustaría señalar que esta no es la primera vez que se usa la sincronización como una forma de simplificar el modelo de desarrollo, ver Meteor por ejemplo : http://devopsangle.com/2012/04/25/pushing-data-not-pages-is-the-new-model-for-application-development/ (aunque, por supuesto, muy controvertido) – jlarson