首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

jQuery Mobile + HTML5 App:AJAX 請求間歇性失敗排查全攻略

     編輯:程式設計綜合問答

手機 App 使用 jQuery Mobile + $.ajax({async: false}) 向後端 .ashx 請求資料,出現**「網路異常,請稍候重試!」** 且時好時壞,Chrome DevTools 顯示 NetworkError: Failed to execute 'send' on 'XMLHttpRequest'。這類間歇性失敗通常非單一原因,需系統化排查。

最常見三大原因與驗證方法

類別典型徵兆快速驗證解決方向
網路層弱訊號、切換基地台、Wi-Fi 斷連、Carrier NAT 逾時手機開熱點給筆電抓包 (Wireshark);或 App 內集成 NetInfo 記錄連線類型/強度加入重試機制 (指數退避);離線快取關鍵資料;監控 navigator.onLine
伺服器/防火牆同一 IP 短時間高頻請求觸發 WAF/CC 防護、應用程式池回收、資料庫連線池耗盡後端 IIS/NGINX 存取日誌對比失敗時間點;檢查 WAF 封鎖記錄;啟用失敗請求追蹤 (FREB)調整 WAF 規則;優化後端連線池;引入 Redis 快取降低 DB 壓力
前端代碼async: false 阻塞主執行緒導致頁面假死、瀏覽器殺掉長時間請求;error 回調未記錄 xhr.status/xhr.responseText改 async: true + Promise/async-await;在 error 印出完整 xhr 物件移除同步 AJAX;統一錯誤處理攔截器;加入請求 ID 便於端到端追蹤

立即可做的三個加強

  1. 完善錯誤日誌:
    error: function(xhr, status, err) {
        console.error('AJAX FAIL', {
          url: this.url,
          status: xhr.status,
          statusText: xhr.statusText,
          response: xhr.responseText,
          readyState: xhr.readyState,
          timestamp: Date.now()
        });
        alert('網路異常,請稍候重試!');
      }
      
  2. 客戶端重試策略 (使用 axios-retry 或自寫):
    function fetchWithRetry(url, options = {}, retries = 3, delay = 500) {
      return fetch(url, options).catch(e => {
        if (retries === 0) throw e;
        return new Promise(r => setTimeout(r, delay))
          .then(() => fetchWithRetry(url, options, retries - 1, delay * 2));
      });
    }
      
  3. 後端健康檢查端點:
    GET /healthz 回傳 {status: "ok", db: "connected", queue: 12},App 啟動/定期輪詢,確認後端可用才發送業務請求。

進階:端到端追蹤

  • 前端產生 X-Request-Id: uuid Header,後端透傳至日誌、資料庫、下游服務。
  • 接入 OpenTelemetry + Jaeger/Zipkin,將前端 fetch/XMLHttpRequest 封裝為 Span,實現全鏈路可視化。
  • 若使用 async: false 係因舊版 jQuery Mobile 單頁應用架構限制,建議漸進式遷移至 Vue/React + Capacitor 或 UniApp,徹底解決同步阻塞問題。

排查清單

[ ] 前端 error 回調是否記錄完整 xhr 物件
[ ] 後端存取日誌是否有對應 4xx/5xx/無記錄(網路未到達)
[ ] WAF/防火牆是否有封鎖該 IP/UA 的記錄
[ ] 機房/雲廠商是否有網路抖動/維護公告
[ ] App 是否在弱網/切換網路環境下測試過
[ ] 是否已移除 async: false 改用非同步模式
[ ] 是否有客戶端重試與離線快取策略

間歇性 AJAX 失敗本質上是 **分散式系統部分失敗** 的典型表現。建立 **可觀測性 (日誌/指標/追蹤)** + **韌性模式 (重試/熔斷/快取/降級)**,才能從根本上提升行動 App 的網路穩定性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved