then - ¿Puedo obtener un jQuery aplazado en document.ready()?
jquery then (6)
Inmediatamente después de cargar mi script, estoy haciendo una solicitud de Ajax para obtener algunas traducciones. Esto siempre debería volver después de que el documento esté listo, ya que estoy cargando mis scripts en la parte inferior de la página, pero sigo sintiendo curiosidad por la posibilidad de obtener un objeto diferido en el estado de documento listo.
De esa manera sería posible asegurarse de que tanto el documento esté listo como la llamada Ajax se haya devuelto con éxito antes de hacer cualquier otra cosa, por ejemplo, de esta forma:
$.when( $.ajax(''translations''), document.ready())
.then(function(){
// Start doing stuff here
});
Aquí hay una versión limpia del comentario de ircmaxell:
(function() {
var doc_ready = $.Deferred();
$(doc_ready.resolve);
$.when(doc_ready, $.ajax(''translations'')).then(function() {
console.log("done");
});
})();
editar
Algunas aclaraciones para detener las ediciones incorrectas:
Pasar una función al objeto jquery (por ejemplo, $(some_func)
) es lo mismo que $(document).ready(some_func)
.
Por lo tanto, el $(doc_ready.resolve);
la línea es solo taquigrafía para algo como esto:
$(document).ready(function() {
doc_ready.resolve()
});
Mi versión es:
$.when(
$.Deferred(function() { $(this.resolve); }),
$.ajax(''translations'')).
then(function() { console.log("done"); });
Prueba esto:
$.when($.ajax(''translations''), $.ready).then(function() {
// Start doing stuff here
});
Puede asociar un objeto diferido con el documento usando data() , y resolve() en su controlador ready
. De esta manera, debería poder usar el objeto diferido almacenado con $.when() :
$(document).data("readyDeferred", $.Deferred()).ready(function() {
$(document).data("readyDeferred").resolve();
});
$.when($.ajax("translations"), $(document).data("readyDeferred"))
.then(function() {
// Start doing stuff here.
});
jQuery''s when
no es una promesa adecuada. Puedes forzarlo en uno como este:
function documentReady() {
return Promise.resolve($.when($.ready));
}
Uso:
documentReady().then(function($) { ... });
Sucede que se resuelve con $
así que eso también es conveniente.
Implementación alternativa:
function documentReady() {
return new Promise(r => $(r));
}
Actualización para referencia (2015):
Esto está disponible en las versiones actuales de jQuery:
$.when($.ready).then(...);
También es sencillo convertir a un flujo usando highlandjs :
_($.when($.ready)).map(transform).pipe(output) // etc.