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之前。总是。
答案 0 :(得分:1)
在jQuery中,处理程序似乎按照我们附加的顺序调用 他们。在我的情况下,.al之前.done
当Deferred被解决或拒绝时,回调将按照添加的顺序执行 jQuery eferred.always Documentation
因此,.done
中的处理程序在附加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);
然后这样称呼:
.done
这将根据您的需要在.always
之前执行getDeferred()
。好处是,如果您仍希望在getDeferred(handlers).done(...)
完成后执行某些操作,您仍然可以执行"Global\\project1"