我有这种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);
});
但事实是,在https请求我的ajax无法正常工作,因为我调用的服务无法通过https访问,我收到错误:ERR_CONNECTION_REFUSED - 所以这很好,我只是想处理它。 我在ajax调用中有.fail,但它没有处理:ERR_CONNECTION_REFUSED
在这种情况下,您能就如何处理:ERR_CONNECTION_REFUSED提出建议吗?
我也试图将我的ajax调用包装到try-catch块,但它也没有工作。
你试过.error属性而不是.fail吗?
尝试在ajax选项中使用timeout属性来触发错误回调
@RickHoving是的,我做到了。 在这种情况下,.error没有被解雇。
您可以使用$.ajax的timeout属性来触发error回调。
如果服务器在特定时间限制内没有响应,这将确保触发error回调。
$.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);
});
当没有互联网时,这将触发fail回调。
那么没有其他方法吗? 你有什么想法try-cath没有处理那个错误吗?try {$.ajax({ ... });} catch(ex) {}
我可以确认没有明确设置超时属性就无法捕捉到这种问题。 另一种方法是检查成功处理程序中的数据值,如果它为空,则执行类似于错误处理程序的操作:stackoverflow.com/a/6792515/615924
在我的情况下,设置超时仍会导致net::ERR_CONNECTION_REFUSED和fail无法运行。 还有其他需要满足的条件吗?
@sreginogemoh关于try {} catch块,它们对同步代码很有用。 使用Asynch ajax调用代码运行并回调注册。 几秒钟之后会触发它们而不会阻塞其余的代码,因此在http promise对象满足或拒绝时,try {} catch块已经完成运行。
当jqXHR.readyState(即$ .ajax(...)。fail()方法的第一个参数的readyState字段)为0时,似乎发生了网络错误。但是,我无法通过JavaScript确定确切的网络错误。
我查看了jQuery Ajax代码,xhr.send()(即XMLHttpRequest.send())方法(生成网络错误)不会捕获也不会抛出错误。因此,不可能抓住它。
浏览器似乎检测并显示正确的错误消息,但jQuery无视发生的特定类型的网络错误。
因此,如果我们得到ERR_CONNECTION_REFUSED,则会调用fail,但实际上无法确定为什么要调用fail。有没有办法检测失败方法内部为什么失败?即超时与连接拒绝?两者之间存在差异。一个我可以重试,另一个没有区别。
您不需要设置超时来处理连接拒绝失败。
如果超时"失败",则该函数的"错误"参数将为"超时"而不是"错误"