前言:昨天,同事修改项目升级插件时遇到了一个ajax 报错,如下:

$.ajax({type : "get",async:false,timeout:3000,url : "http://10.10.10.26:808/servlet/updateLog?line=1",dataType : "jsonp",//数据类型为jsonpjsonp: "jsonpCallback",//服务端用于接收callback调用的function名的参数success : function(data){console.log(data)},error:function(e){alert('fail');console.log(e);},complete:function(r,t){console.log(r);console.log(t)}})

net::ERR_CONNECTION_TIMED_OUT --连接超时

排查原因是:发ajax请求时,该日志服务正在启动(服务可能没有起来),有时间差。

但是,有了新的疑问-->为什么没走error和complete 回调呢?

查资料得知:这是由于这次请求是跨域的jsonp;

JQuery跨域请求的缺陷:错误处理
跨域请求可能会失败,比如对方服务器的安全设置拒绝接受来自我方的请求(我方不在对方的信任列表中),或者网络不通,或对方服务器已关闭,或者请求地址或参数不正确导致服务器报错等等。

在JQuery中,当使用ajax或getJSON发送请求后会返回一个jqXHR对象[3]。该对象实现了Promise协议,所以我们可以使用它的done、fail、always等接口来处理回调。例如我们可以用在它的fail回调中进行请求失败时的错误处理:

let xhr = $.getJSON(...);
xhr.fail(function(jqXHR, textStatus, ex) {alert('request failed, cause: ' + ex.message);
});

这种方式能够处理“正常的错误”,例如超时、请求被中止、JSON解析出错等等。但它对那些“非正常的错误”,例如网络不通、服务器已关闭等情况的支持并不好。此时不会走任何一个回调(success、error、complete...).

例如当对方服务器无法正常访问时,在Chrome下你会在控制台看到一条错误信息:

查看代码知道jsonpo跨域方式 会在head标签前部插入一个script标签;所以可用一下方法解决这个问题。

var head = document.head || $('head')[0] || document.documentElement; // code from jquery
var script = $(head).find('script')[0];
script.onerror(function(evt) {alert('error');//清除掉这个无效的script 节点if (script.parentNode) {script.parentNode.removeChild(script);}// delete jsonCallback global functionvar src = script.src || '';var idx = src.indexOf('jsonCallback=');if (idx != -1) {var idx2 = src.indexOf('&');if (idx2 == -1) {idx2 = src.length;}var jsonCallback = src.substring(idx + 13, idx2);delete window[jsonCallback];}
});

请求接受json tp5_关于jq jsonp跨域请求错误处理bug相关推荐

  1. 原生JS实现Ajax和JSONP跨域请求

    背景: 对接身份证录入和门锁卡号录入设备中,安装驱动完成后,提供的接口服务是http://localhost:8099/?cmd=readbcardid&charset=gbk,返回的数据格式 ...

  2. 实现百度下拉菜单实例(利用jsonp跨域请求百度数据接口)

    JSONP:是JSON  with padding(填充式JSON或参数式JSON)的简写,它由两部分组成:回调函数和数据.回调函数是当响应到来时应该在页面中调用的函数,回调函数的名字一般是在请求中指 ...

  3. JSONP跨域请求数据报错 “Unexpected token :”的解决办法

    原文  http://www.cnphp6.com/archives/65409 Jquery使用ajax方法实现jsonp跨域请求数据的时候报错 "Uncaught SyntaxError ...

  4. Jsonp 跨域请求实例

    Jsonp 跨域请求实例 关于jsonp的一个实例,其实自己也不是很了解,今天下午稍微研究了一下: 简单来说,jsonp就是为了两个不同网站之间数据传递而产生的,主要用于js脚本,因为浏览器本身是禁止 ...

  5. jsonp跨域请求响应结果处理函数(python)

    接口测试跨域请求接口用的jsonp,需要将回调函数里的json字符串提取出来. jsonp跨域请求的响应结果格式: callback_functionname(json字符串). #coding:ut ...

  6. 轻松搞定JSONP跨域请求

    轻松搞定JSONP跨域请求 一.同源策略 要理解跨域,先要了解一下"同源策略".所谓同源是指,域名,协议,端口相同.所谓"同源策略",简单的说就是基于安全考虑, ...

  7. 【漏洞利用】JSONP跨域请求漏洞 挖掘、利用详解

    参考文章 轻松搞定JSONP跨域请求 jsonp跨域原理,使用以及同源策略 跨域漏洞丨JSONP和CORS跨域资源共享 Tag: Ref: [[019.同源策略]] 本片文章仅供学习使用,切勿触犯法律 ...

  8. .net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器...

    1.WebForm使用母版页后执行的顺序是先执行子页面中的Page_Load,再执行母版页中的Page_Load,请求是先生成母版页的控件树,然后将子页面生成的控件树填充到母版页中,最后输出 2.We ...

  9. JS的jsonp是什么?5分钟学会jsonp跨域请求

    一.jsonp是什么? jsonp是解决跨域请求的一种技术.浏览器为了防止CSRF攻击会采用同源策略(协议/主机/端口均相同)限制,对非同源发起http请求(即跨域请求)会被浏览器阻止. 二.json ...

最新文章

  1. Linux下给PHP安装redis扩展
  2. Qt控制中控考勤SDK
  3. 信息系统项目管理师案例考试汇总(2005~2021年)
  4. oracle顺序读发散读,Oracle 拼音排序
  5. JS 转换数字为大写
  6. 数据结构-树的基础代码
  7. WPF入门教程系列(一) 创建你的第一个WPF项目
  8. java中10个用户注册_JavaWeb(十)Session
  9. JSON与MAP之间的转换
  10. mysql--创建表,插入数据,修改表名,删除表,简单查询/内连接、左/右连接
  11. 从源码入手,一文带你读懂Spring AOP面向切面编程
  12. matlab 阶乘函数代码
  13. c语言编程输出一到十,c语言编程输出1?
  14. 如何成为一个AI产品经理?
  15. (ECCV-2020)步态横向网络-GLN
  16. CentOs下安装pip3
  17. java split竖线_java对竖线|进行分割(split)操作
  18. WPS Excel表格怎么启用宏功能?
  19. 误差卡尔曼中的四元数运动学-第二章
  20. thrust示例ex4: Sinc方法数据重采样加密

热门文章

  1. 适合程序员的画图工具
  2. Mysql 一条SQL语句实现批量更新数据,update结合case、when和then的使用案例
  3. 怎么从mysql注册表删除用户_mysql 创建和删除用户
  4. ecshop根目录调用_ECSHOP各文件夹功能说明
  5. 输出有样式的php,PHP导出带样式的Excel
  6. 不显示_电脑不显示桌面图标怎么办?
  7. linux 1号硬盘不能用,linux 挂载硬盘的疑问 : IDE1 上的接口无法使用.
  8. linux 喂狗时间,狗狗正确喂食时间表,喂狗最佳时间指南
  9. mybatis更新时间字段_你以为把Mybatis型处理器了解了,就不会“暴雷”了!
  10. php查找以xx结尾的的字符串单词,Javascript中查找不以XX字符结尾的单词示例代码_javascript技巧...