根据官方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状态代码被视为成功。其他任何东西都会触发错误回调。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐