Fondamentalmente, Deferred.pipe() è un equivalente asincrono a $.map(). Proietta nuovi valori da altri valori forniti come input, ma il suo scopo deve essere utilizzato con continuazioni.
Iniziamo con un esempio che richiede solo $.each()
ed emette una richiesta AJAX che restituisce un oggetto semplice. Per ogni proprietà di questo oggetto, vogliamo il controllo del modulo il cui attributo id
è la chiave della proprietà per impostarne il valore sul valore della proprietà.Possiamo scrivere qualcosa del tipo:
$.ajax("your/url", {
dataType: "json"
}).done(function(data) {
$.each(data, function(key, value) {
$("#" + key).val(value);
});
});
Ora diciamo che vogliamo applicare qualche funzione ai valori prima di aggiornare i controlli del modulo. Se lo facciamo a livello locale, dobbiamo solo scrivere:
$.ajax("your/url", {
dataType: "json"
}).done(function(data) {
$.each(data, function(key, value) {
// doSomethingWith() projects values synchronously, as map() does.
$("#" + key).val(doSomethingWith(value));
});
});
Ma cosa succede se doSomethingWith()
non è implementata sul lato client, ma lato server attraverso un altro servizio web? In tal caso, vogliamo concatenare il flusso di controllo nella seconda richiesta AJAX e aggiornare solo i controlli del modulo quando viene restituita la seconda richiesta. Deferred.pipe()
rende così facile:
$.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);
});
});
fonte
2012-04-20 21:19:21
Avete controllato http://api.jquery.com/deferred.pipe/? – Armatus
Sì, sì. Ho iniziato da lì. – Diego
Si noti che 'deferred.pipe' e' deferred.when' sono equivalenti dalla v1.8 (consultare http://stackoverflow.com/questions/12011925/pipe-and-then-documentation-vs-reality-in-jquery- 1-8) – tokland