在jQuery中,怎么可能只在所有.done或.fail处理程序之后触发.always处理程序?
例如,如果我有一个返回如下延迟的函数:
function getDeferred() {
return $.ajax({
url: '/test.json',
type: 'GET',
dataType: 'json',
cache: false
}).fail(function (jqXHR, textStatus, errorThrown) {
alert('fail !');
}).always(function (jqXHR, textStatus, errorThrown) {
alert('always !');
});
}
我可以有一个全局 .always 处理程序并附加一个特定的 .done 处理程序,如下所示:
getDeferred().done(function (data, textStatus, jqXHR) {
alert('done !');
});
在jQuery中,处理程序的调用顺序似乎与我们附加它们的顺序相同。就我而言,.总是在 .done 之前。
在jQuery中,处理程序的调用顺序似乎与我们附加的顺序相同 他们。就我而言,.总是在 .done 之前
当解决或拒绝延迟时,回调将按添加顺序执行。
jQuery eferred.always Documentation
因此,在附加.done
之前执行getDeferred
中的处理程序是有意义的
有什么技巧可以做我想做的事情吗?
我不知道是否有特定的延迟对象方式,但您可以将其他处理程序作为参数传递并根据需要执行它们。
下面可能看起来很复杂,很可能有更好的方法,但它应该有效。
function getDeferred(handlers) {
var defaultHandlers = {
done: {},
fail: {},
always:{},
}
var _handlers = $.extend({}, defaultHandlers, handlers);
return $.ajax({
url: '/test.json',
type: 'GET',
dataType: 'json',
cache: false
}).done(function(jqXHR, textStatus, errorThrown) {
if ($.isFunction(_handlers.done)) {
_handlers.done();
}
}).fail(function(jqXHR, textStatus, errorThrown) {
alert('fail !');
if ($.isFunction(_handlers.fail)) {
_handlers.fail();
}
}).always(function(jqXHR, textStatus, errorThrown) {
alert('always !');
if ($.isFunction(_handlers.always)) {
_handlers.always();
}
});
}
然后这样称呼它:
var handlers = {
done: function(data, textStatus, jqXHR) {
alert('done !');
}
}
getDeferred(handlers);
这将根据需要在.always
之前执行您的.done
。好处是,如果你仍然希望在getDeferred()
完成后执行某些东西,你仍然可以做getDeferred(handlers).done(...)