當(dāng)一個(gè)接口需要依賴(lài)另一個(gè)接口的請(qǐng)求數(shù)據(jù)時(shí)
1.將請(qǐng)求數(shù)據(jù)的接口設(shè)為同步肛著,之后調(diào)另一個(gè)接口
2.在請(qǐng)求數(shù)據(jù)接口的成功回調(diào)里調(diào)另一個(gè)接口。
但是當(dāng)一個(gè)接口需要依賴(lài)很多個(gè)接口的請(qǐng)求數(shù)據(jù) 或者 一個(gè)依賴(lài)另一個(gè)砾层,另一個(gè)再依賴(lài)另一個(gè) 的情況該怎么解決呢?
當(dāng)然你可以按照單個(gè)接口依賴(lài)的方式層層嵌套贱案,結(jié)果就是代碼結(jié)構(gòu)混亂肛炮,可讀性差,性能差(一個(gè)需要依賴(lài)很多個(gè)的時(shí)候要把很多個(gè)設(shè)為同步)宝踪。
因此侨糟,我們需要一種更優(yōu)雅的異步回調(diào)處理方式--Promise
直接上代碼:
//創(chuàng)建一個(gè)Promise實(shí)例,獲取數(shù)據(jù)瘩燥。并把數(shù)據(jù)傳遞給處理函數(shù)resolve和reject秕重。需要注意的是Promise在聲明的時(shí)候就執(zhí)行了。
var getData1 = () => {
return new Promise(function(resolve,reject){
$.ajax({
type:"get",
url:"index.aspx",
success:function(data){
if(data.Status=="1"){
resolve(data.ResultJson)//在異步操作成功時(shí)調(diào)用
}else{
reject(data.ErrMsg);//在異步操作失敗時(shí)調(diào)用
}
}
});
})
}
var getData2 = () => {
return new Promise(function(resolve,reject){
$.ajax({
type:"get",
url:"index.aspx",
success:function(data){
if(data.Status=="1"){
resolve(data.ResultJson)//在異步操作成功時(shí)調(diào)用
}else{
reject(data.ErrMsg);//在異步操作失敗時(shí)調(diào)用
}
}
});
})
}
var getData3 = () => {
return new Promise(function(resolve,reject){
$.ajax({
type:"get",
url:"index.aspx",
success:function(data){
if(data.Status=="1"){
resolve(data.ResultJson)//在異步操作成功時(shí)調(diào)用
}else{
reject(data.ErrMsg);//在異步操作失敗時(shí)調(diào)用
}
}
});
})
}
場(chǎng)景一:先調(diào)用getData1颤芬,再調(diào)用getData2悲幅,再調(diào)用getData3 ...
getData1().then(function(res){
return getData2(res)
}).then(function(res){
return getData3(res)
}).then(function(res){
console.log(res)
}).cache(function(error){
console.log(error)
})
場(chǎng)景二:getData3的執(zhí)行依賴(lài)getData1和getData2
//Promise的all方法套鹅,等數(shù)組中的所有promise對(duì)象都完成執(zhí)行
Promise.all([getData1,getData2]).then(function([ResultJson1,ResultJson2]){
//這里寫(xiě)等這兩個(gè)ajax都成功返回?cái)?shù)據(jù)才執(zhí)行的業(yè)務(wù)邏輯
getData3()
})
或結(jié)合 async await 使用
async function fun(){
let a = await getData1();
let b = await getData2();
let c = await getData3();
}
優(yōu)點(diǎn):這樣的代碼分工非常明確站蝠,ajax就是拿數(shù)據(jù)的,.then .catch方法就是處理業(yè)務(wù)邏輯卓鹿,代碼異常清晰菱魔。