jQuery Deferred.then()不是';t在.fail()之后调用

jQuery Deferred.then()不是';t在.fail()之后调用,jquery,jquery-deferred,Jquery,Jquery Deferred,我正在使用jQuery.Deferred并注册done、fail和然后处理程序: $.when( some_ajax(url) ) .done(function(result){}) .fail(function(){}) .then(function(){}); //just like that, with a single parameter 我发现,当我的ajax调用成功时,done和将按以下顺序调用回调。但是,当ajax失败时,会调用fail回调,但我无法访问t

我正在使用jQuery.Deferred并注册
done
fail
然后
处理程序:

$.when( some_ajax(url) )
    .done(function(result){})
    .fail(function(){})
    .then(function(){}); //just like that, with a single parameter
我发现,当我的ajax调用成功时,
done
将按以下顺序调用
回调。但是,当ajax失败时,会调用
fail
回调,但我无法访问
then
回调

我已经阅读了jQuery.Deferred文档,但找不到有关此行为原因的提示

当使用
始终
而不是
然后
时,在成功和失败两种情况下都会调用它(首先调用
完成
/
失败
,然后调用
始终
)。文档似乎没有指出
始终
然后
之间的预期差异。在我描述的场景中,为什么它们的行为不同?

的语法是
。然后()
,这就是为什么在成功的情况下都会调用,而在失败的情况下只会调用
失败

在本例中,您只将一个回调传递给
.then()
方法,它将被注册为成功回调,因此您有两个成功回调,一个注册为
done()
,另一个注册为
.then()
。但对于错误情况,只有一个回调注册到
.fail()


如果您希望调用回调而不考虑成功/失败,那么使用

调用
then()
只处理成功,因此不处理失败案例是很正常的(我认为这是Arun p Johny在回答中说的)。或者你的意思是在你的实际代码中也将失败处理程序传递给
then()
。@FrédéricHamidi谢谢,希望我的问题现在清楚了(编辑)它确实更清楚了,Arun的回答是正确的:你对
then()
的调用只处理成功,而不是失败,因此,在失败的情况下,不调用处理程序是合乎逻辑的。现在投票表决太本地化!!!!我怀疑你的答案是正确的(我们需要提问者提供更多的信息来确定),但可能还不够清楚。我建议你试着澄清你所说的“成功”是什么意思,现在可以理解为“成功”和“失败”处理程序都被调用了,这是错误的。(顺便说一句,我试图抵消反对票,但你可能应该删除你之前的评论:这是多余的,可以被视为冒犯性的,对你的情况没有帮助)。@FrédéricHamidi可能是的,但我受够了一些疯狂的东西downvotes@FrédéricHamidi有时甚至会想到离开论坛,但有时我发现另一个答案被否决了,我也给出了同样的答案,并且被接受了。但是另一个用户被否决了