Since jQuery 1.8 .then
行为相同.pipe
:
弃用通知:从 jQuery 1.8 开始,deferred.pipe()
方法已弃用。这deferred.then()
应该使用替代它的方法。
and
从 jQuery 1.8 开始, the deferred.then()
方法返回一个新的 Promise,可以通过函数过滤 deferred 的状态和值,替换现在已弃用的 Promisedeferred.pipe()
method.
下面的示例可能对某些人仍然有帮助。
它们有不同的用途:
-
.then()
每当您想要处理过程的结果时,即如文档所述,当延迟对象被解决或拒绝时,就可以使用。与使用相同.done()
or .fail()
.
-
你会用.pipe()
到(前)filter结果不知何故。回调的返回值.pipe()
将作为参数传递给done
and fail
回调。它还可以返回另一个延迟对象,并且以下回调将在此延迟对象上注册。
情况并非如此.then()
(or .done()
, .fail()
),注册回调的返回值将被忽略。
所以这不是你使用的either .then()
or .pipe()
. You could use .pipe()
出于相同的目的.then()
但反之则不成立。
实施例1
某些操作的结果是一个对象数组:
[{value: 2}, {value: 4}, {value: 6}]
并且您想要计算值的最小值和最大值。假设我们使用两个done
回调:
deferred.then(function(result) {
// result = [{value: 2}, {value: 4}, {value: 6}]
var values = [];
for(var i = 0, len = result.length; i < len; i++) {
values.push(result[i].value);
}
var min = Math.min.apply(Math, values);
/* do something with "min" */
}).then(function(result) {
// result = [{value: 2}, {value: 4}, {value: 6}]
var values = [];
for(var i = 0, len = result.length; i < len; i++) {
values.push(result[i].value);
}
var max = Math.max.apply(Math, values);
/* do something with "max" */
});
在这两种情况下,您都必须迭代列表并从每个对象中提取值。
预先以某种方式提取值,这样您就不必在两个回调中单独执行此操作,这不是更好吗?是的!这就是我们可以使用的.pipe()
for:
deferred.pipe(function(result) {
// result = [{value: 2}, {value: 4}, {value: 6}]
var values = [];
for(var i = 0, len = result.length; i < len; i++) {
values.push(result[i].value);
}
return values; // [2, 4, 6]
}).then(function(result) {
// result = [2, 4, 6]
var min = Math.min.apply(Math, result);
/* do something with "min" */
}).then(function(result) {
// result = [2, 4, 6]
var max = Math.max.apply(Math, result);
/* do something with "max" */
});
显然这是一个编造的例子,有很多不同的(也许更好的)方法来解决这个问题,但我希望它能说明这一点。
实施例2
考虑 Ajax 调用。有时您希望在前一个 Ajax 调用完成后启动一个 Ajax 调用。一种方法是在 a 中进行第二次调用done
打回来:
$.ajax(...).done(function() {
// executed after first Ajax
$.ajax(...).done(function() {
// executed after second call
});
});
现在假设您想要解耦代码并将这两个 Ajax 调用放入一个函数中:
function makeCalls() {
// here we return the return value of `$.ajax().done()`, which
// is the same deferred object as returned by `$.ajax()` alone
return $.ajax(...).done(function() {
// executed after first call
$.ajax(...).done(function() {
// executed after second call
});
});
}
您想使用延迟对象来允许其他代码调用makeCalls
附加回调secondAjax 调用,但是
makeCalls().done(function() {
// this is executed after the first Ajax call
});
由于第二次调用是在 a 内进行的,因此不会达到预期的效果done
回调并且无法从外部访问。
解决方案是使用.pipe()
反而:
function makeCalls() {
// here we return the return value of `$.ajax().pipe()`, which is
// a new deferred/promise object and connected to the one returned
// by the callback passed to `pipe`
return $.ajax(...).pipe(function() {
// executed after first call
return $.ajax(...).done(function() {
// executed after second call
});
});
}
makeCalls().done(function() {
// this is executed after the second Ajax call
});
通过使用.pipe()
现在,您可以将回调附加到“内部”Ajax 调用,而无需公开调用的实际流程/顺序。
一般来说,延迟对象提供了一种有趣的方式来解耦代码:)