2017-10-14 4 views
0

Je me présente plusieurs requêtes ajax en utilisant jQuery dans un Promise.all:Accès erreur ajax jQuery des prises Promise.all

const firstFetchPromise = $.ajax({ url: '/some/url' }); 
const secondFetchPromise = $.ajax({ url: '/another/url' }); 

Promise.all([ firstFetchPromise, secondFetchPromise ]) 
    .then(results => storeResults(results)) 
    .catch(e => { 
    console.log(e); // e is a promise, how to get the ajax error? 
    }); 

Pour tester la gestion des erreurs que je arrêter le serveur que les demandes ajax obtiennent leurs données à partir de et le navigateur enregistre un ERR_CONNECTION_REFUSE avec l'URL.

Les journaux de déclaration de capture quelque chose qui ressemble à une promesse:

abort:ƒ (a), 
always:ƒ(), 
complete:ƒ(), 
done:ƒ(), 
error:ƒ(), 
fail:ƒ(), 
getAllResponseHeaders:ƒ(), 
getResponseHeader:ƒ (a), 
overrideMimeType:ƒ (a), 
pipe:ƒ(), 
progress:ƒ(), 
promise:ƒ (a), 
readyState:0, 
responseText:"", 
setRequestHeader:ƒ (a,b), 
state:ƒ(), 
status:0, 
statusCode:ƒ (a), 
statusText:"error", 
success:ƒ(), 
then:ƒ(), 

Comment puis-je obtenir l'erreur ajax qui est dans la promesse que je peux afficher un message d'erreur lisible dans la page Web?

+1

'e est un promise' - il ne devrait pas être - que journal de la console que vous avez montré ne ressemble pas du tout comme une promesse (getResponseHeader, getAllResponseHeaders , setRequestHeader, overrideMimeType tous ressemblent à des méthodes XHR) –

+0

Cela pourrait très bien être le cas, je suis nouveau pour les promesses, plus habitué aux rappels. J'ai mis à jour la question avec l'objet complet. Je m'attendais à ce qu'il y ait un message d'erreur lié au réseau. L'objet comme les clés promettent, puis, échouent etc, donc j'ai pensé que c'était une promesse. – user3381520

Répondre

0

Promise.all() rejette avec la raison de la première promesse qui rejette.

Dans ce cas, il s'agit de jqXHR$.ajax.

Vous pouvez obtenir l'erreur comme ceci:

Promise.all([ firstFetchPromise, secondFetchPromise ]) 
    .then(results => storeResults(results)) 
    .catch(e => { 
    console.log(e.responseText); // Server response 

    e.fail(function (jqXHR, textStatus, errorThrown) { 
     console.log(e === jqXHR); // true 
     console.log(textStatus); // 'error' 
     console.log(errorThrown); // 'HTTP/2.0 404' 
    }); 
}); 
+0

Merci, c'est logique. N'y a-t-il aucun moyen d'obtenir des informations sur l'erreur? J'aurais pensé que les navigateurs auraient plus qu'une simple "erreur". – user3381520

+0

Vous pouvez obtenir la réponse du serveur dans 'e.responseText'. – aaron