promise 和async /await

封裝一個(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)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容