Tengo un objeto que actúa como un cliente API del lado del cliente que expone varias funciones que devuelven objetos jQuery ajax(). Algunas de esas llamadas ajax tienen llamadas .done() y .fail() encadenadas directamente a ellas porque son acciones que deben tomarse cada vez que las respuestas de la API regresan antes de que el resto del código js pueda manejar la respuesta. . Cosas bastante estándar.
Necesito iniciar una cantidad variable de solicitudes de API, esperar a que todas fallen o tengan éxito y luego continuar con el procesamiento. Para los ejemplos que crearé, simplificaré esto a solo dos llamadas ajax.
Así que creo una matriz para contener los objetos ajax devueltos, y luego uso $.when().apply(null, deferreds).then(function(){//do something after both ajax requests complete}) . Cuando las llamadas se completan con éxito, todo funciona muy bien. Cuando las llamadas fallan (como si ajax llamara 404), las cosas no son tan buenas.
El problema es que .then() no parece detectar las fallas, aunque pensé que se suponía que then() () se activaría independientemente del éxito o el fracaso de la(s) promesa(s) subyacente(s) .
Puedo cambiar a .always() , que parece funcionar mejor (ya que detecta las fallas y aún activa la devolución de llamada) pero parece activarse antes de algunas de las devoluciones de llamada .fail() que se registran directamente en las llamadas ajax, lo que no tiene sentido para mí ya que pensé que las devoluciones de llamada para una llamada ajax se llamaron en el orden en que se registraron.
Estoy seguro de que me falta algo sobre el comportamiento del combo ajax() when() then() .
Violín que muestra llamadas exitosas usando .then() : https://jsfiddle.net/kwrLyw6q/5/
Fiddle usando .then() con llamadas ajax fallidas (no funciona, me encantaría saber por qué. Parece que esta es la forma "correcta" de hacerlo, pero no puedo entender dónde me estoy equivocando): https: //jsfiddle.net/kwrLyw6q/2/
Fiddle usando .always() (funcionando, pero observe el orden de devolución de llamada fuera de servicio. ¡Al menos, fuera de servicio en comparación con el orden en que los quiero!): https://jsfiddle.net/kwrLyw6q/7/
Parece que deferred.then() toma tres argumentos: