2011-11-06 10 views
9
$.ajax("example.php").done(function() 
{ 
    alert(...); 
}).fail(function() 
{ 
    alert(...); 
}).always(function() 
{ 
     alert(...); 
}); 

vsjQuery ¿Ventajas diferidas?

$.ajax("example.php", 

     success: function() 
     { 
      alert(''); 
     }, 
     error: function() 
     { 
      alert(''); 
     }, 
     complete: function() 
     { 
      alert(''); 
     } 
); 

Lo siento, no puedo ver ninguna ventaja

¿Puede usted explicar por favor?

O tal vez puede usted darme el ejemplo de la anterior que no se puede lograr por este último ...?

+2

Encogiéndose ... Supongo que el primero puede sentirse más jQuery-y para algunos. No creo que haya más que una ventaja estilística aquí. –

Respuesta

5

Para los principiantes, el segundo bloque de código no es sintácticamente válido. Diría que es una ventaja de la primera :P


Pero con toda seriedad:

Es sólo una sintaxis diferente para lograr el mismo resultado final. Una ventaja inmediata es que se puede cablear múltiples funciones para cada resultado con diferida:

$.get("example.php").done(function() 
{ 
    alert("success 1"); 
}).done(function() 
{ 
    alert("success 2"); 
}); 

de lo contrario tendría que hacerlo de esta manera:

function done1() 
{ 
    alert('success 1'); 
} 
function done2() 
{ 
    alert('success 2'); 
} 

$.ajax('example.php', 
{ 
    success: function() 
    { 
     done1.apply(this, arguments); 
     done2.apply(this, arguments); 
    } 
}); 

Otras ventajas, citaron How can jQuery deferred be used?

  • Deferreds son perfectos para cuando t La tarea puede o no funcionar de forma asincrónica, y desea abstraer esa condición del código.
  • ... Recuperando datos de varias fuentes. En el siguiente ejemplo, estoy obteniendo varios objetos de esquema JSON independientes utilizados en una aplicación existente para la validación entre un cliente y un servidor REST. En este caso, no quiero que la aplicación del navegador empiece a cargar datos antes de que se hayan cargado todos los esquemas. $ .when.apply(). then() es perfecto para esto.
  • Se puede utilizar A diferido en lugar de un mutex. Esto es esencialmente lo mismo que los escenarios múltiples de uso de ajax.
+0

Aún es difícil ver alguna diferencia. desde cuando estoy ejecutando "example.php" estoy esperando una respuesta (éxito o hecho nunca) .Estoy buscando alguna evway duro de ventajas ... :) –

+1

Ver mi edición para casos más elegantes. No me gusta la API diferida? No lo uses –

+1

Acabo de ver el ejemplo de http://stackoverflow.com/questions/4869609/how-can-jquery-deferred-be -used y esta línea 'return cache [val] || $ .ajax ('/ foo /', ... 'me hizo darme cuenta de que puedo usar' when' en callbackFunction ** INDEPENDIENTEMENTE ** la respuesta que puede ser del caché o de la llamada ajax ... nice. thank –

4

yo diría que dilatará objetos son sólo un paso más en la evolución de jQuery.

Antes de ellos, solo era posible pasar las devoluciones de llamada a $.ajax en el objeto de configuración. Teniendo deferrds, ahora puede manejar toda la ejecución asincrónica o incluso sincrónica con ellos, lo que conduce a una interfaz más unificada. Esta es la ventaja: simplificación hasta unificación.

Algo similar ocurrió con la introducción de on. No existe una ventaja real de on sobre bind, pero simplifica el manejo de eventos en el sentido de que combina la funcionalidad de bind, live y delegate. El resultado es una API unificada para el manejo de eventos. O uso dos veces la misma función, on, o bind y delegate.

De manera similar, si quiero hacer dos llamadas Ajax dependientes, puedo usar dos llamadas $.ajax más $.when, que es con lo que estoy familiarizado y no es diferente de hacer una o varias llamadas, o Anoto una llamada dentro de la otra, lo que me obliga a pensar diferente sobre cómo se lleva a cabo la ejecución.

Los objetos diferidos son una forma unificada y general para la ejecución de código asincrónico. Eso no significa que la forma anterior de agregar devoluciones de llamada deba eliminarse, rompería una gran cantidad de código. Y además de eso, todavía está más cerca de los métodos del objeto original XMLHTTPRequest, que algunas personas podrían preferir.

+0

¿Los objetos diferidos son solo para llamadas asincrónicas? –

+0

Todavía no sé cuándo tengo que usar 'cuándo' Vi ejemplos que te permiten hacer' then' sin 'when' ... ¿puedes explicarlo? –

+0

No, eso es por qué lo cambié a "ejecución asíncrona o incluso sincrónica" ... A menudo lo usaba de forma asíncrona y creo que ese es su objetivo principal. –

1

El beneficio principal con los objetos diferidos es que puede pasarlos, por lo que para casos complejos en los que ajax ejecuta código no sabe quién más está interesado en la devolución de llamada o no desea codificarlo, puede simplemente pasarlo el objeto diferido a los plugins/código de módulo.

p. Ej.

var defer = $.get("example.php"); 
for(var i=0; i<ajax_observers.length;i++){ 
    ajax_observers[i].hook(defer) 
} 

Lo mismo se puede hacer a través de devoluciones de llamada, pero entonces tendrá que escribir un interfaz para obtener funciones de devolución de los observadores, y que no es flexible, con observadores diferido se pueda hacer nada con objetos diferidos.

+0

como' $ ("a"). clic (preExistsingfunc) '??? –

+0

¿Qué knid de objetos hay en' ajax_observers'? –

+0

es usted usando complementos aquí? –