封裝一個(gè)ajax
function ajax (options){
//先準(zhǔn)備一個(gè)默認(rèn)值
var defInfo={
url: ' ',//地址不需要默認(rèn)值
type='get',//請(qǐng)求方式默認(rèn)為get
async: false,//默認(rèn)是異步
data:' ',//參數(shù)沒有默認(rèn)值
dataType:'string',//默認(rèn)不需要執(zhí)行json.parse
success(){}//默認(rèn)是一個(gè)函數(shù)
}
//先來判斷一下有沒有傳遞url 如果沒有,直接拋出異常
if(!options.url){
throw new Error('url 必須傳遞')
}
//有了url以后 我們就把用戶傳遞的參數(shù)和我們的默認(rèn)數(shù)據(jù)合并
for(let key in options){
defInfo [key] = options[key]
}
}
Promise 是一個(gè)ES6的語法 是用來專門解決異步回調(diào)地獄的問題
什么是回調(diào)函數(shù)?
回調(diào)函數(shù)就是把函數(shù)A當(dāng)作參數(shù)傳遞到函數(shù)B中,在函數(shù)B中以形參的方式進(jìn)行調(diào)用
function a(callback){
callback()
}
function b (){
console.log('我是函數(shù)B')
}
a(b)//b的實(shí)參 值 賦值 形參 callback
promise 就是一個(gè)語法
我們的每一個(gè)異步事件 在執(zhí)行的時(shí)候 都會(huì)有三個(gè)狀態(tài) 執(zhí)行中/成功/失敗
因?yàn)樗顺晒Φ幕卣{(diào)函數(shù) 我們就可以使用promise來解決多個(gè)ajax發(fā)送問題
new Promise(function(resolve, reject){
ajax({
url:'第一個(gè)請(qǐng)求',
success(res){
resolve(res)
}
}).then(function(res){
//準(zhǔn)備發(fā)送第二個(gè)請(qǐng)求
return new Promise(function(resolve, reject){
ajax({
url:'第二個(gè)請(qǐng)求',
data: {a: res.a, b: res.b},
success(res){
resolve(res)
}
})
})
}).then(function(res){
ajax({
url: '第三個(gè)請(qǐng)求',
data: {a: res.a, b: res.b },
success (res) {
console.log(res)
}
})
})
這個(gè)時(shí)候 我們的代碼就改觀了很多 方便維護(hù)了 但還遠(yuǎn)遠(yuǎn)不夠 還需要更加簡(jiǎn)化代碼
需要用到一個(gè) ES7 的語法 async await 這個(gè)語法是回調(diào)地獄的終極解決方案
語法
async function fn (){
const res1 = await promise對(duì)象1
const res2 = await promise對(duì)象2
const res3 = await promise對(duì)象3
}
//await promise對(duì)象1 等著promise對(duì)象1 內(nèi)部的異步操作執(zhí)行完以后再去執(zhí)行 第二行代碼 await promise對(duì)象2
//promise 對(duì)象1 的異步操作完成以后 才會(huì)執(zhí)行promise2 , promise2執(zhí)行完以后才會(huì)去執(zhí)行promise3
這是一個(gè)特殊的函數(shù)方式
可以把異步代碼寫的看起來像同步代碼
只要是一個(gè) promiser 對(duì)象,那么我們就可以使用 async/await 來書寫
async function fn() {
const res = await new Promise(function (resolve, reject) {
ajax({
url: '第一個(gè)地址',
success (res) {
resolve(res)
}
})
})
// res 就可以得到請(qǐng)求的結(jié)果
const res2 = await new Promise(function (resolve, reject) {
ajax({
url: '第二個(gè)地址',
data: { a: res.a, b: res.b },
success (res) {
resolve(res)
}
})
})
const res3 = await new Promise(function (resolve, reject) {
ajax({
url: '第三個(gè)地址',
data: { a: res2.a, b: res2.b },
success (res) {
resolve(res)
}
})
})
// res3 就是我們要的結(jié)果
console.log(res3)
}