Básicamente, Deferred.pipe() es un equivalente asíncrono a $.map(). Proyecta nuevos valores a partir de otros valores proporcionados como entrada, pero su propósito es ser utilizado con continuaciones.
Comencemos con un ejemplo que solo requiere $.each()
y emite una solicitud AJAX que devuelve un objeto simple. Para cada propiedad de este objeto, queremos que el control de formulario cuyo atributo id
sea la clave de la propiedad establezca su valor en el valor de la propiedad.Podemos escribir algo como:
$.ajax("your/url", {
dataType: "json"
}).done(function(data) {
$.each(data, function(key, value) {
$("#" + key).val(value);
});
});
Ahora digamos que queremos aplicar alguna función a los valores antes de actualizar los controles de formulario. Si lo hacemos a nivel local, sólo tenemos que escribir:
$.ajax("your/url", {
dataType: "json"
}).done(function(data) {
$.each(data, function(key, value) {
// doSomethingWith() projects values synchronously, as map() does.
$("#" + key).val(doSomethingWith(value));
});
});
Pero qué sucede si doSomethingWith()
no está implementado en el cliente, pero del lado del servidor a través de otro servicio web? En ese caso, queremos encadenar el flujo de control en la segunda solicitud de AJAX y solo actualizar los controles de formulario cuando haya regresado la segunda solicitud. Deferred.pipe()
hace tan fácil:
$.ajax("your/url", {
dataType: "json"
}).pipe(function(theOriginalData) {
return $.ajax("your/web/service/doSomethingWith", {
data: theOriginalData,
dataType: "json"
});
}).done(function(theFinalData) {
$.each(theFinalData, function(key, value) {
$("#" + key).val(value);
});
});
¿Ha comprobado http://api.jquery.com/deferred.pipe/? – Armatus
Sí, lo he hecho. Empecé desde allí. – Diego
Tenga en cuenta que 'deferred.pipe' y' deferred.when' son equivalentes desde v1.8 (vea http://stackoverflow.com/questions/12011925/pipe-and-then-documentation-vs-reality-in-jquery- 1-8) – tokland