J'ai ce genre de javascript:
$.ajax({
url: "//myapi.com/json",
dataType: "jsonp"
}).done(function (data) {
selectText('Id', data.country);
}).fail(function (jqXHR, textStatus, errorThrown) {
var defaultOption = 'US'
selectDropdownByText('Id', defaultOption);
console.log(errorThrown);
});
Mais le problème, c’est que, sur la demande https, mon ajax ne fonctionne pas car le service que j’appelle n’est pas accessible via https et que je reçois l’erreur :ERR_CONNECTION_REFUSED
- c’est bien, je veux juste gérer cela. J'ai .fail
dans l'appel ajax, mais il ne gère pas le :ERR_CONNECTION_REFUSED
Pouvez-vous donner des conseils sur la façon de traiter le :ERR_CONNECTION_REFUSED
dans ce cas?
J'essayais également d'encapsuler mon appel ajax dans le bloc try-catch
, mais cela ne fonctionnait pas non plus.
Vous pouvez utiliser la propriété timeout
de $.ajax
pour déclencher le rappel error
.
Cela garantira que le rappel error
est déclenché si le serveur ne répond pas dans un délai déterminé.
$.ajax({
url: "//myapi.com/json",
dataType: "jsonp",
timeout: 15000 // adjust the limit. currently its 15 seconds
}).done(function (data) {
selectText('Id', data.country);
}).fail(function (jqXHR, textStatus, errorThrown) {
var defaultOption = 'US'
selectDropdownByText('Id', defaultOption);
console.log(errorThrown);
});
Cela déclenchera le rappel fail
quand il n’y aura pas non plus d’Internet.
Il semble que lorsque jqXHR.readyState (c'est-à-dire que le champ readyState du premier paramètre de la méthode $ .ajax (...). Fail ()) ait la valeur 0, une erreur réseau s'est produite. Cependant, je n'ai pas été en mesure de déterminer quelle est l'erreur exacte du réseau via JavaScript.
J'ai examiné le code jQuery Ajax et xhr.send () (c'est-à-dire la méthode XMLHttpRequest.send ()) (qui génère l'erreur de réseau) ne détecte ni ne renvoie l'erreur. Ainsi, il n'est pas possible de l'attraper.
Il semble que le navigateur détecte et affiche le message d'erreur correct, mais que jQuery est inconscient du type d'erreur de réseau spécifique qui se produit.
Donc, fail
est appelé si nous obtenons un ERR_CONNECTION_REFUSED
, mais il n’ya aucun moyen de voir réellement pourquoi fail
est appelé. Existe-t-il un moyen de détecter dans la méthode fail pourquoi les choses ont échoué? c.-à-d. timeout vs connexion refusée? Il y a une différence entre les deux. Un je pourrais éventuellement réessayer, l'autre ne fait aucune différence.
Vous n'avez pas besoin de définir de délai d'expiration pour gérer les échecs de connexion refusés.