工作留檔--$.post和$.ajax區別
阿新 • • 發佈:2021-01-26
今天部署開發任務的時候,我接到的活中有一個修改bug的活(哈哈,水平不夠bug來湊),這個bug是這樣式的,點選修改,下拉框動態載入資料有時可以載入到有時又不能獲取到。這個是不是很神奇啊。剛開始拿到這個任務的時候,我就考慮到了載入順序的問題。果不其然啊,我一看js程式碼,我的乖乖,通篇全用的$.post,部分程式碼如下:
$.post(url, Obj, function(result){
var dataObj=eval("("+result+")");//為啥要寫這句程式碼,後面說
... ..............//後面就不寫了
我修改之後的程式碼如下:
function getA(){
var Obj = {
className:'這個就自己看自己的嘍',
methodName:'同上',
};
$.ajax({
url: url,
data:Obj,
type:'post',
dataType:'json',
async:false,//下方有解釋
success:function(result) {
var dataObj= result;
*******//下面就不寫了
上述程式碼的*async:false;*解釋如下:
在ajax中,async來控制非同步或同步,預設為true,表示為非同步請求,在具體執行過程的表現為,在這個Ajax程式碼執行的過程中其它程式碼同樣可以執行,那麼這裡就可能出現一個問題,在ajax請求執行中,可能ajax還未執行完,就可能已經完成了ajax請求後面的操作。(這也是我這個bug出現的原因)。但是當設定為false時,表現的為同步請求,同步請求的意思就是當js程式碼執行到當前ajax時,會停止頁面中的所有程式碼,當Ajax請求執行完畢後,才繼續執行。
而$.post預設就是為非同步請求,所以會出現很多很多這樣的問題,資料還沒加載出來呢,你就完事了。就像結婚新娘還沒接到家呢,你婚禮就完事了。那是不是就感覺肯定缺少點啥。
差點忘了:
var dataObj=eval("("+result+")");//為啥要寫這句程式碼,現在說
解釋:如果jquery非同步請求沒做型別說明,或者以字串方式接受,那麼需要做一次物件化處理,就是將該字串放於eval()中執行一次。這種方式也適合以普通javascipt方式獲取json物件。