基本上,Deferred.pipe() 与 $.map() 是异步等效的。它从作为输入提供的其他值投射新值,但其目的是与延续一起使用。
让我们从一个只需要$.each() 并发出返回简单对象的AJAX 请求的示例开始。对于该对象的每个属性,我们希望其id 属性是属性键的表单控件将其值设置为属性值。我们可以这样写:
$.ajax("your/url", {
dataType: "json"
}).done(function(data) {
$.each(data, function(key, value) {
$("#" + key).val(value);
});
});
现在假设我们想在更新表单控件之前对值应用一些函数。如果我们在本地这样做,我们只需要写:
$.ajax("your/url", {
dataType: "json"
}).done(function(data) {
$.each(data, function(key, value) {
// doSomethingWith() projects values synchronously, as map() does.
$("#" + key).val(doSomethingWith(value));
});
});
但是如果doSomethingWith() 不是在客户端实现,而是通过另一个Web 服务在服务器端实现,会发生什么?在这种情况下,我们希望将控制流链接到第二个 AJAX 请求中,并且仅在第二个请求返回时更新表单控件。 Deferred.pipe() 让这一切变得简单:
$.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);
});
});