web-dev-qa-db-fra.com

Comment gérer net :: ERR_CONNECTION_REFUSED dans jquery ajax

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.

15
sreginogemoh

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.

6
mohamedrias

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.

1
Darwin Airola

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.

0
BradW