根据官方JQuery文档:
jqXHR.always(function(data|jqXHR, textStatus, jqXHR|errorThrown) { });
An alternative construct to the complete callback option, the
.always() method replaces the deprecated .complete()method.
In response to a successful request, the function's arguments are the
same as those of .done(): data, textStatus, and the jqXHR object. For
failed requests the arguments are the same as those of .fail(): the
jqXHR object, textStatus, and errorThrown. Refer to deferred.always()
for implementation details.
让我们说我有以下ajax脚本:
$.ajax({
url: 'myPHPScript.php',
type: 'POST',
data: {
param_1: 'value_1',
param_n: 'value_n'…
},
username: 'myLogin',
password: 'myPassword',
beforeSend: function() {
alert('The object was created but not yet initilized');
}
}).done(function(data, textStatus, jqXHR) {
alert('All the request was sent and we received data');
}).fail(function(jqXHR, textStatus, errorThrown) {
alert('Error: the following error was occurred: ' + textStatus + ' Status : ' + jqXHR.Status);
}).always(function() {
// Here is my problem
});
在.always()函数中,如何为每个语句指定不同的函数,我的意思是当Deferred被解析时,always()函数会传递以下参数(data,textStatus,jqXHR)但是如果延迟被拒绝 它被传递(jqXHR,textStatus,errorThrown)。
谢谢
当然,这是.done()和.fail()的用途,你可以有多个这样的回调。
@Orbling,感谢你的重播,我知道.done()和.fail()中的每一个都会执行我正在寻找的部分内容,但正如你所知道的那样.fail()仅在另一个执行时执行 没有成功,在其他方面它们并不是每次都在一起执行,但是,.always()一直被调用,这就是为什么它很重要,但我所说的问题是将代码的一部分分开来 根据不同的状态执行。
你能不能只检查第一个参数,看它是否是jqXHR然后呢?
唯一的好解决方案是不使用always中的参数 - 如果需要特定于AJAX成功/失败的代码,请在done或fail回调中调用它们。 通常,always回调是您执行诸如重新启用按钮,隐藏悸动等事情的地方。所有这些都是您不关心请求结果的事情。
除此之外,您可以检查arguments.length的参数数量,然后通过arguments[0]等访问参数。但是依赖参数计数是一个坏主意,因为它可能不是未来的证据。
@TheifMaster,感谢你的重播,但是如果我可以重新启用一个按钮,在.done()中隐藏一个throbber等等条件测试,如:if(jqXHR.status === 200){// Re - 启用按钮,隐藏悸动等。}例如,有什么必须有.always()函数?如果是这样,我认为.always()不是必需的,应该从JQuery中删除。
@ghaliloo因为always()总是运行,而done()仅在解析延迟对象时运行(即ajax查询成功)
@ghaliloo不,如果请求成功,那只会重新启用该按钮。 ThiefMaster想要在请求之后重新启用按钮,无论它是否成功,这都是.always()的用例。
@ghaliloo不需要使用always函数。如果它不适合您的情况,请不要使用它。
@Mike,hhhhhhhhhhhhh,不,如果它不适合我的情况我就不会发表一篇关于它的新帖子,相反它对我来说非常有用,因为我想做一个任务,如果差异被解决了另一个如果它被拒绝,我必须在.always()中进行,因为它总是被调用,但是如果我输入.done()或.fail(),我将无法保证它将被执行。
@ghaliloo但我认为你错过了这一点。如果你使用done / fail / always,你将始终至少完成/ always或fail / always fire。因此,任何特定于成功或失败的逻辑都应该驻留在那些处理程序中。在这两种情况下都需要执行的任何逻辑(比如显示包含结果的div)都应该总是放在一起,这样你就不必在完成/不执行这些任务时都有公共代码。从本质上讲,它始终是一种重构工具。
默认情况下,只有2xx状态代码被视为成功。其他任何东西都会触发错误回调。