ajax長連線返回資料進不了success狀態為canceled
阿新 • • 發佈:2019-02-11
前端實現:
function ajaxLongConn(){
$.ajax({
type : "POST",//
//async : true, //同步執行
timeout :180000,//單次超時長連線時間為三分鐘
url : "${ctx}/pollModel/timerPollReport.html",
dataType : "json", //返回資料形式為json
success : function (result) {
//請求成功不遞迴,整個web生命週期僅會成功一次
var data = result.poll_report;
//alert("result:" + result);
//setTimeout('alert("12465")',5000);
popMsg(data.pollTime,data.pollId,data.totalPoll, data.errPresent, data.errTotal);
ajaxLongConn(); // 遞迴呼叫以防止巡檢時間發生改變
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
if (textStatus == "timeout") { // 請求超時
ajaxLongConn(); // 遞迴呼叫
// 其他錯誤,如網路錯誤等
} /* else {
ajaxLongConn();
} */
},
});
}
ajaxLongConn();
後臺程式碼:
private static Boolean poll_flag = false;//彈出標識
private static int pollCounter;
@RequestMapping(value = "/timerPollReport", produces = "text/html;charset=UTF-8;")
public @ResponseBody String timerPollReport(){
Map<String,Object> report;
String nowDate;
while (true) {
try {
nowDate = DateUtil.toDate(new Date(),"HH:mm");
//如果巡檢標識標記為未巡檢
if(pollCounter == 0)
pollCounter = PollCron.poll_count;
if(pollCounter != PollCron.poll_count) {
poll_flag = false;//如果巡檢被重置,彈出標識也需要被重置
pollCounter = PollCron.poll_count;
}
if (!StringUtils.isNull(PollCron.sendReport) && nowDate.compareTo(PollCron.sendReport) > 0 && PollCron.isPoll && !poll_flag) {
poll_flag = true;//已經彈出,等待下次重置彈出
report = PollCron.reportMap;
System.out.println("傳送巡檢報告~~~~");
break;
}
Thread.sleep(30000);//防止循序太頻繁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return JsonUtil.objToJson(report);
}
後臺已經滿足條件並呼叫 return JsonUtil.objToJson(report); 但是前端並沒有執行 success 中的程式碼。
查開啟 F12 發現 timerPollReport.html 狀態為 calceled。
所以推測是由於請求的連結在前端已經被終止,此刻擁有的連結和返回資料的連結不匹配所有不能執行 success 方法。
解決辦法:
1.將 ajax 的 type : “POST” 修改為 GET。
2.將 ajax 的 timeout 時間延長
糾正一下,連線被cancle屬於正常顯示,長連線返回進不了success可能是由於瀏覽器或系統限制!