Promise 01

  1. Promise 對(duì)象
  • Promise 對(duì)象,是異步編程的一種解決方案,可以將異步操作以同步操作的流程表達(dá)出來,避免層層嵌套的回調(diào)函數(shù)。
  • Promise 實(shí)現(xiàn)了鏈?zhǔn)秸{(diào)用,也就是說每次調(diào)用 then 之后返回的都是一個(gè) Promise ,并且是一個(gè)全新的Promise ,原因也是因?yàn)闋顟B(tài)不可變。如果你在then中 使用了return,那么return的值會(huì)被 Promise.resolve()包裝
  1. Promise 使用
  • 第一步:初始化一個(gè) promise 對(duì)象,有兩種方式創(chuàng)建
方式一: new Promise( callback )
方式二: Promise.resolve(callback)
  • 第二步:調(diào)用第一步返回的 promise 對(duì)象的 then 方法,注冊回調(diào)函數(shù)
    • then 中的回調(diào)函數(shù)可以有一個(gè)參數(shù),也可以不帶參數(shù)。如果 then 中的回調(diào)函數(shù)依賴上一步的返回結(jié)果,那么要帶上參數(shù)。比如
new Promise( callback)
.then( callback(value){
  //  處理value
} )
  • 第三步,最后注冊 catch 異常處理函數(shù),處理前面回調(diào)中可能拋出的異常。
new Promise( callback)
.then( callback(value) {
  //  處理value
} )
.catch(err => {
  console.log(err)
})
  1. Promise 對(duì)象簡析
const promise = new Promise( function(resolve,reject) {
  // ...some code 
  if(success){  // success 即異步操作成功的條件
    resolve(value)
  }else {
    reject(err)
  }
}) 
  • Promise 對(duì)象接收一個(gè)函數(shù)作為參數(shù),而該函數(shù)接收兩個(gè)函數(shù)(resolvereject)作為參數(shù),這兩個(gè)函數(shù)JavaScript 提供,自己不用部署
  • resolve:異步操作成功時(shí)調(diào)用,并將異步操作的結(jié)果作為參數(shù)傳遞出去
  • reject:異步操作失敗時(shí)調(diào)用,并將異步操作報(bào)出的錯(cuò)誤作為參數(shù)傳遞出去
  1. 使用 Promise 改寫 ajax
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <script>
    function ajax(opts) {
      let promise = new Promise((resolve, reject) => {
        let url = opts.url
        let type = opts.type || "Get"
        let dataType = opts.dataType || function () { }
        let onerror = opts.onerror || function () { }
        let data = opts.data || {}

        let dataStr = []
        for (let key in data) {
          dataStr.push(key + '=' + data[key])
        }
        dataStr = dataStr.join('&')
        if (type === "Get") {
          url += "?" + dataStr
        }

        let xhr = new XMLHttpRequest()
        xhr.open(type, url, true)
        xhr.onload = function () {
          if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
            if (dataType === "json") {
              let retJson = JSON.parse(xhr.responseText)
              resolve(retJson) // 異步操作成功,調(diào)用 resolve函數(shù)
            } else {
              resolve(xhr.responseText)
            }
          } else {
            reject() // 異步操作失敗,調(diào)用 reject 函數(shù)
          }
        }

        xhr.onerror = onerror
        if (type === "POST") {
          xhr.send(dataStr)
        } else {
          xhr.send()
        }
      })
      return promise
    }

    // 測試
    ajax({
      url: 'http://api.jirengu.com/getWeather.php',
      data: {
        city: '長沙'
      }
    }).then(function (ret) {
      console.log(ret)
    }).catch(function () {
      console.log('服務(wù)器異常')
    })
  </script>
</body>

</html>
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 一個(gè)人的孤獨(dú)不寂寞,兩個(gè)人的孤獨(dú)才寂寞。熱鬧的表象,孤獨(dú)的靈魂無處安放。一邊熱鬧著,一邊孤獨(dú)著,可以用手輕輕一...
    草木石閱讀 314評(píng)論 0 1
  • 2019年4月27日星期六天氣陰轉(zhuǎn)小雨 今天是星期六,女兒沒有上學(xué)去。早上,我早早起床做了早飯。我做好了早飯先去叫...
    助力孩子成長日記周曉然媽媽閱讀 167評(píng)論 0 1
  • 戛然而止的事情有很多,比如驚雷,驚夢,驚嚇。一般的時(shí)候,都會(huì)醒來,或孟醒或蘇醒或驚醒。而把自己的一切都拋于腦后,什...
    彥良閱讀 179評(píng)論 0 0
  • 當(dāng)一切終于歸于平靜時(shí),再次見到那片海,洶涌動(dòng)蕩共振內(nèi)心,從心底翻涌的波浪攪亂了整個(gè)心房。 我是有多...
    阿段_410e閱讀 387評(píng)論 0 2

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