1. 程式人生 > >ajax長連線返回資料進不了success狀態為canceled

ajax長連線返回資料進不了success狀態為canceled

前端實現:

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可能是由於瀏覽器或系統限制!