请求接受json tp5_关于jq jsonp跨域请求错误处理bug
前言:昨天,同事修改項(xiàng)目升級(jí)插件時(shí)遇到了一個(gè)ajax 報(bào)錯(cuò),如下:
$.ajax({type : "get",async:false,timeout:3000,url : "http://10.10.10.26:808/servlet/updateLog?line=1",dataType : "jsonp",//數(shù)據(jù)類型為jsonpjsonp: "jsonpCallback",//服務(wù)端用于接收callback調(diào)用的function名的參數(shù)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 --連接超時(shí)
排查原因是:發(fā)ajax請(qǐng)求時(shí),該日志服務(wù)正在啟動(dòng)(服務(wù)可能沒有起來),有時(shí)間差。
但是,有了新的疑問-->為什么沒走error和complete 回調(diào)呢?
查資料得知:這是由于這次請(qǐng)求是跨域的jsonp;
JQuery跨域請(qǐng)求的缺陷:錯(cuò)誤處理
跨域請(qǐng)求可能會(huì)失敗,比如對(duì)方服務(wù)器的安全設(shè)置拒絕接受來自我方的請(qǐng)求(我方不在對(duì)方的信任列表中),或者網(wǎng)絡(luò)不通,或?qū)Ψ椒?wù)器已關(guān)閉,或者請(qǐng)求地址或參數(shù)不正確導(dǎo)致服務(wù)器報(bào)錯(cuò)等等。
在JQuery中,當(dāng)使用ajax或getJSON發(fā)送請(qǐng)求后會(huì)返回一個(gè)jqXHR對(duì)象[3]。該對(duì)象實(shí)現(xiàn)了Promise協(xié)議,所以我們可以使用它的done、fail、always等接口來處理回調(diào)。例如我們可以用在它的fail回調(diào)中進(jìn)行請(qǐng)求失敗時(shí)的錯(cuò)誤處理:
let xhr = $.getJSON(...); xhr.fail(function(jqXHR, textStatus, ex) {alert('request failed, cause: ' + ex.message); });這種方式能夠處理“正常的錯(cuò)誤”,例如超時(shí)、請(qǐng)求被中止、JSON解析出錯(cuò)等等。但它對(duì)那些“非正常的錯(cuò)誤”,例如網(wǎng)絡(luò)不通、服務(wù)器已關(guān)閉等情況的支持并不好。此時(shí)不會(huì)走任何一個(gè)回調(diào)(success、error、complete...).
例如當(dāng)對(duì)方服務(wù)器無法正常訪問時(shí),在Chrome下你會(huì)在控制臺(tái)看到一條錯(cuò)誤信息:
查看代碼知道jsonpo跨域方式 會(huì)在head標(biāo)簽前部插入一個(gè)script標(biāo)簽;所以可用一下方法解決這個(gè)問題。
var head = document.head || $('head')[0] || document.documentElement; // code from jquery var script = $(head).find('script')[0]; script.onerror(function(evt) {alert('error');//清除掉這個(gè)無效的script 節(jié)點(diǎn)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];} });總結(jié)
以上是生活随笔為你收集整理的请求接受json tp5_关于jq jsonp跨域请求错误处理bug的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 监听端口数据客户端ip_PHP做
- 下一篇: 罗盘时钟编码代码_安全研究 | 利用ma