一、ajax嵌套ajax,傳說中的嵌套金字塔,以及這種方式只能串聯(lián)發(fā)起ajax請求
function getDataFun(){
.ajax({url: "/equip_rank",type:'GET',dataType:'jsonp',success: function(data1){.ajax({url: "/score_rank",type:'GET',dataType:'jsonp',success: function(data2){
$.ajax({url: "/summon_rank",type:'GET',dataType:'jsonp',success: function(data3){
console.log(data1);
console.log(data2);
console.log(data3);
}
})
}
})
}
})
}
以上方法雖然可行,但是當(dāng)ajax請求增多,嵌套層數(shù)也逐漸加深,代碼就變得難以維護(hù)了,而且請求是串聯(lián)發(fā)起的,效率也不高。
二、設(shè)置一個全局變量flag,所有ajax接口都可以同時發(fā)起請求,而且代碼分離,在每個ajax的回調(diào)中都統(tǒng)一回調(diào)一個函數(shù),由這個函數(shù)來判斷flag值是否達(dá)到條件。需要注意的地方:雖然開始只執(zhí)行了兩個ajax的時候,flag的值還不是3,但是只要第三個ajax的回調(diào)函數(shù)執(zhí)行成功,flag為3,前兩個ajax的回調(diào)函數(shù)會立即執(zhí)行if(flag == 3){}代碼塊
function getDataFun(){
var flag = 0,
_data1,
_data2,
_data3;
$.ajax({url: "/equip_rank",type:'GET',dataType:'jsonp',success: function(data1){
flag++;
_data1 = data1;
if(flag == 3){
//do something
}
}
})
$.ajax({url: "/score_rank",type:'GET',dataType:'jsonp',success: function(data2){
flag++;
_data2 = data2;
if(flag == 3){
//do something
}
}
})
$.ajax({url: "/billionaire_rank",type:'GET',dataType:'jsonp',success: function(data3){
flag++;
_data3 = data3;
if(flag == 3){
//do something
}
}
})
}
三、使用jquery的.when()方法,就是promise模式,讓異步請求方式變?yōu)殒準(zhǔn)秸{(diào)用,以及能做到并聯(lián)請求 jquery的ajax方法返回的對象Deferred Object,因此可以用.when()處理返回的結(jié)果。使用$.when()方法,多個異步請求是同步處理的,而且它返回的是promise對象,可以使用then,done來處理返回的結(jié)果。
function getDataFun(){
var fun1 = .ajax({url: "/equip_rank",type:'GET',dataType:'jsonp'}), fun2 =.ajax({url: "/score_rank",type:'GET',dataType:'jsonp'}),
fun3 = .ajax({url: "/billionaire_rank",type:'GET',dataType:'jsonp'});.when(fun1,fun2,fun3).then(function(data1,data2,data3){
//成功回調(diào),所有請求正確返回時調(diào)用
console.log(data1[0]);
console.log(data2);
console.log(data3);
},function(){
//失敗回調(diào),任意一個請求失敗時返回
console.log('fail!!');
})
}
如果所有請求成功返回,then方法里面的第一個回調(diào)執(zhí)行,如果任意一個請求失敗,則執(zhí)行then方法里面的第二個回調(diào)。注意每個請求返回的結(jié)果,例如本例中的data1,data2,data3實際上返回的是一個數(shù)組,里面的數(shù)據(jù)依次是[data,statusText,jqXHR]。
此處還有一種情況就是,如果請求個數(shù)不確定怎么破,我們可以用js里面的apply方法,把請求放在數(shù)組里面處理。
function getDataFun(){
var reqlist = [];
reqlist.push(.ajax({url: "/equip_rank",type:'GET',dataType:'jsonp'})); reqlist.push(.ajax({url: "/score_rank",type:'GET',dataType:'jsonp'}));
reqlist.push($.ajax({url: "/billionaire_rank",type:'GET',dataType:'jsonp'}));
$.when.apply($,reqlist).then(function(data1,data2,data3){
//成功回調(diào),所有請求正確返回時調(diào)用
console.log(data1[0]);
console.log(data2[1]);
console.log(data3[2]);
},function(){
//失敗回調(diào),任意一個請求失敗時返回
console.log('fail!!');
})
}
四、讓后臺把請求合并成一個
注意:
ajax為異步請求,絕對不能使用setTimeout方式做回調(diào),因為setTimeout會因用戶的網(wǎng)速,服務(wù)器響應(yīng)時間,電腦配置等問題,會導(dǎo)致異步時間不一樣。