jQuery 在所有附加的 .done/.fail 处理程序之后触发 .always handler



在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(...)

相关内容

最新更新