概述
最近工作中使用ajax,有時會報json4 is not a function的錯誤,有時又不會報錯。找了很久,網上說是因為多次請求同一個資源導致的,但是我檢查了自己的代碼,對於重復資源並沒有重復請求,並且,按理說,即使同時請求同一個資源也不應該報這個錯誤。
最后終於發現原因了,是因為timeout超時填的是5000,但由於資源加載,這個ajax從開始請求到接收到資源的總時間超過了5s,所以報了這個錯。
總結一下,報這個錯的原因是timeout字段設置太小了。
解決方案
那怎么解決呢?
方法之一是去掉timeout。但是對於移動端來說,我還是傾向於加上timeout。
通過檢查代碼,發現這個ajax請求這么長時間的原因是,有一段js插入了圖片,從而導致圖片資源和ajax幾乎同時進行http請求,但是圖片資源的http請求優先度比較高,所以先加載圖片,但是在加載圖片之前,由於ajax發送了請求,所以timeout已經開始計時了,等到圖片加載完成,ajax返回數據的時候,所用總時間已經超過了timeout值。
所以方法之二是對那些圖片使用懶加載,但是代碼改動比較大,而且體驗也沒那么好。
方法之三是,移動代碼,使這個ajax請求返回了值之后再加載插入圖片的js代碼。這個我本來不怎么認同的,但是這么處理之后,性能有很驚人的優化,找不出原因。最后我使用了這種方案。
我學到了什么
- ajax的timeout導致的報錯和解決方案。
- 圖片資源的http請求優先級高於ajax。(不論誰先發出http請求)