2015-04-02 5 views
14

Ich habe diese Art von javascript:Wie Netz zu handhaben :: ERR_CONNECTION_REFUSED in jquery ajax

$.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); 
}); 

Aber die Sache ist, dass auf HTTPS-Anfrage meiner Ajax funktioniert nicht, weil Service, den ich anrufen bin nicht zugänglich ist über https und ich bekomme Fehler :ERR_CONNECTION_REFUSED - so ist das in Ordnung, ich will nur damit umgehen. Ich habe .fail in Ajax Anruf, aber es wird nicht behandelt :ERR_CONNECTION_REFUSED Könnten Sie in diesem Fall Rat geben, wie man mit :ERR_CONNECTION_REFUSED umgehen?

Ich habe auch versucht, meinen Ajax-Anruf auf try-catch Block zu wickeln, aber es hat auch nicht funktioniert.

+0

Haben Sie die .error Eigenschaft anstelle der .fail ausprobiert? –

+0

Versuchen Sie, 'Timeout'-Eigenschaft in AJAX-Optionen zu verwenden, um den Fehler Rückruf – mohamedrias

+0

@RickHoving ja ich tat. '.error' feuert nicht für diesen Fall. – sreginogemoh

Antwort

6

Sie können die timeout Eigenschaft von $.ajax verwenden, um den Rückruf error abzusetzen.

Dadurch wird sichergestellt, dass der Rückruf error ausgelöst wird, wenn der Server nicht innerhalb eines bestimmten Zeitlimits reagiert.

$.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); 
}); 

Dies löst den fail Rückruf, wenn kein Internet auch dort ist.

+0

Also gibt es keinen weiteren Weg? Hast du irgendwelche Ideen, warum 'try-cath' diesen Fehler nicht löst? 'try {$ .ajax ({...});} catch (ex) {}' – sreginogemoh

+0

Ich kann bestätigen, dass es keine Möglichkeit gibt, diese Art von Problem zu lösen, ohne explizit das Timeout-Attribut zu setzen. Eine andere Möglichkeit kann darin bestehen, den Datenwert im Erfolgs-Handler zu prüfen, und wenn etwas leer ist, etwas Ähnliches wie den Fehler-Handler zu tun: http://stackoverflow.com/a/6792515/615924 – rikpg

+1

In meinem Fall resultiert das Setzen des Timeouts immer noch in ' net :: ERR_CONNECTION_REFUSED' und 'fail' werden nicht ausgeführt. Gibt es eine andere Bedingung, die erfüllt werden muss? – dlsso

0

So fail wird genannt zu werden, wenn wir ein ERR_CONNECTION_REFUSED bekommen, aber es gibt keinen Weg, um tatsächlich zu sehen, warum fail genannt wird. Gibt es eine Möglichkeit, innerhalb der Fehlermethode zu erkennen, warum etwas fehlgeschlagen ist? d.h. Timeout vs Verbindung verweigert? Es gibt einen Unterschied zwischen den beiden. Eins könnte ich möglicherweise wiederholen, das andere macht keinen Unterschied.

Sie müssen das Zeitlimit nicht festlegen, um fehlgeschlagene Verbindungen zu behandeln.

+0

Wenn Sie für eine Zeitüberschreitung "fehlschlagen", wird der Parameter "Fehler" der Funktion "Timeout" und nicht "Fehler" – Claudio

1

Es scheint, dass, wenn JQXHR.readyState (d. H. Das readyState-Feld des ersten Parameters zu der $ .ajax (...). Fail() -Methode) 0 ist, dass ein Netzwerkfehler aufgetreten ist. Den genauen Netzwerkfehler konnte ich jedoch nicht über JavaScript feststellen.

Ich habe den jQuery Ajax-Code angeschaut, und xhr.send() (d. H. Die XMLHttpRequest.send()) -Methode (die den Netzwerkfehler erzeugt) fängt den Fehler nicht und wirft ihn auch nicht. Daher ist es nicht möglich, es zu fangen.

Es scheint, dass der Browser die richtige Fehlermeldung erkennt und anzeigt, dass jQuery jedoch den spezifischen Typ des auftretenden Netzwerkfehlers nicht bemerkt.

Verwandte Themen