我有一个充当客户端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/