jQuery .when()。then()没有按预期工作

时间:2017-03-30 01:57:38

标签: javascript jquery ajax

我有一个充当客户端API客户端的对象,它暴露了几个都返回jQuery ajax()对象的函数。其中一些ajax调用将.done().fail()调用直接链接到它们上,因为它们是每次API响应返回之前需要采取的操作,然后才允许其余的js代码处理响应。非常标准的东西。

我需要启动可变数量的API请求,等待所有失败或成功,然后继续处理。对于我将创建的示例,我将简化为两个ajax调用。

所以我创建了一个数组来保存返回的ajax对象,然后使用$.when().apply(null, deferreds).then(function(){//do something after both ajax requests complete})。当呼叫成功完成时,一切都很顺利。当呼叫失败时(例如,如果ajax呼叫404s),情况就不那么好了。

问题是.then()似乎没有检测到失败,even though I thought then() was supposed to be fired regardless of success or failure of the underlying promise(s)

我可以切换到.always(),这似乎更好(因为它检测到失败并仍然触发回调)但似乎在直接注册的一些.fail()回调之前触发关于ajax调用,这对我来说没有意义,因为我认为ajax调用的回调是按照他们注册的顺序调用的。

我确信我只是遗漏了ajax() when() then()组合的行为。

使用.then()显示成功通话的小提琴:https://jsfiddle.net/kwrLyw6q/5/

使用.then()与失败的ajax调用小提琴(不工作,很想知道为什么。看起来这样做是“正确的”方式,但我无法弄清楚我哪里出错了):https://jsfiddle.net/kwrLyw6q/2/

使用.always()小提琴(工作,但请注意无序的回调顺序。至少,与我想要的顺序相比无序!):https://jsfiddle.net/kwrLyw6q/7/

1 个答案:

答案 0 :(得分:1)

看起来deferred.then()有三个参数:

  • 成功函数(第一个参数)。
  • 失败功能(第二个参数)。
  • 进度函数(第三)

updated fiddle