Grundsätzlich ist Deferred.pipe() ein asynchrones Äquivalent zu $.map(). Es projiziert neue Werte von anderen Werten, die als Eingabe bereitgestellt werden, aber sein Zweck ist es, mit Fortsetzungen verwendet zu werden.
Beginnen wir mit einem Beispiel, das nur $.each()
erfordert und eine AJAX-Anforderung ausgibt, die ein einfaches Objekt zurückgibt. Für jede Eigenschaft dieses Objekts möchten wir das Formularsteuerelement, dessen id
Attribut der Schlüssel der Eigenschaft ist, um seinen Wert auf den Wert der Eigenschaft festzulegen.Wir können so etwas wie schreiben:
$.ajax("your/url", {
dataType: "json"
}).done(function(data) {
$.each(data, function(key, value) {
$("#" + key).val(value);
});
});
Nun lassen Sie uns sagen, dass wir eine Funktion auf die Werte anwenden möchten, bevor Sie die Formular-Steuerelemente zu aktualisieren. Wenn wir das vor Ort machen, wir müssen nur schreiben:
$.ajax("your/url", {
dataType: "json"
}).done(function(data) {
$.each(data, function(key, value) {
// doSomethingWith() projects values synchronously, as map() does.
$("#" + key).val(doSomethingWith(value));
});
});
Aber was passiert, wenn doSomethingWith()
nicht clientseitige implementiert, aber serverseitige durch einen anderen Web-Service? In diesem Fall möchten wir den Kontrollfluss in die zweite AJAX-Anfrage eingliedern und die Formularsteuerelemente nur aktualisieren, wenn die zweite Anfrage zurückgegeben wurde. Deferred.pipe()
macht so einfach:
$.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);
});
});
Haben Sie http://api.jquery.com/deferfer.pipe/ überprüft? – Armatus
Ja, ich habe. Ich habe von dort angefangen. – Diego
Beachten Sie, dass 'deferred.pipe' und' defered.when' seit v1.8 gleichwertig sind (siehe http://stackoverflow.com/questions/12011925/pipe-and-then-documentation-vs-reality-in-jquery- 1-8) – tokland