请求接受json tp5_关于jq jsonp跨域请求错误处理bug
前言:昨天,同事修改項目升級插件時遇到了一個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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 监听端口数据客户端ip_PHP做
- 下一篇: 罗盘时钟编码代码_安全研究 | 利用ma