gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 16:00:50 25 4
gpt4 key购买 nike

在 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之前。

最佳答案

In jQuery, handlers seem to be called in the same order we attach them. In my case, .always before .done

当延迟被解决或拒绝时,回调将按照添加的顺序执行。
jQuery eferred.always Documentation

因此,getDeferred 中的处理程序在附加 .done 之前执行是有意义的

Is there any tricks to do what I want to do ?

我不知道是否有特定的延迟对象方式,但您可以将附加处理程序作为参数传递并根据需要执行它们。

下面的内容可能看起来很复杂,很可能有更好的方法,但它应该可行。

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

关于javascript - jQuery 在所有附加的 .done/.fail 处理程序之后触发 .always 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42293739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com