談?wù)剬romise的理解(面試題)

導(dǎo)讀:

在我們面試過程中,面試官一般都會選擇問這樣一個問題:談一談對Promise的理解?

那接下來,我們就來詳細(xì)的了解一下Promise,相信認(rèn)真閱讀之后,就有一個比較完整的答案啦!

1.Promise解決的問題

1)回調(diào)地獄

1.1)什么是回調(diào)地獄?

簡單來說:就是 無限的在回調(diào)函數(shù)里面進(jìn)行回調(diào)函數(shù)的調(diào)用--回調(diào)函數(shù)的嵌套

<script>
    //第一次請求
      $.ajax({
          url: './111.txt',
          success: function (res) {
              console.log(res)  //222

              // 第二次請求
              $.ajax({
                  url: './' + res + '.txt',
                  success: function (result) {
                      console.log(result)

                    //第三次請求
                      $.get('./'+result+'.txt',function(response){
                          console.log(response)
                          //繼續(xù)寫對應(yīng)的請求或者別的事件
                      })
                  }
              })
          }
      })
</script>
1.2)回調(diào)函數(shù)的缺點:
  • 代碼可維護(hù)性極低
  • 對于閱讀代碼非常不友好
1.3)Promise產(chǎn)生背景:

為了解決回調(diào)地獄的問題,以及使異步的請求有同步執(zhí)行的機(jī)制,ES6幫我們增加了一個Promise的對象來解決這個問題,這也是Promise產(chǎn)生的背景。

1.4)異步的概念:

異步(Asynchronous, async)是與同步(Synchronous, sync)相對的概念。

在我們學(xué)習(xí)的傳統(tǒng)單線程編程中,程序的運行是同步的(同步不意味著所有步驟同時運行,而是指步驟在一個控制流序列中按順序執(zhí)行)。而異步的概念則是不保證同步的概念,也就是說,一個異步過程的執(zhí)行將不再與原有的序列有順序關(guān)系。

簡單來理解就是:同步按你的代碼順序執(zhí)行,異步不按照代碼順序執(zhí)行,異步的執(zhí)行效率更高。

JavaScript 中的異步操作函數(shù)往往通過回調(diào)函數(shù)來實現(xiàn)異步任務(wù)的結(jié)果處理

  • 通過一張圖來更好的理解異步和同步的概念:
異步和同步的區(qū)別

2.Promise的三種狀態(tài)

  • pending (進(jìn)行中)
  • 此時代碼執(zhí)行尚未結(jié)束,所以也叫未處理的(unsettled)
  • fulfilld (已成功)
  • 表示異步代碼執(zhí)行成功,由resolve()觸發(fā)
  • rejected (已失敗)
    • 遇到錯誤,異步代碼執(zhí)行失敗,由reject()觸發(fā)

Promise 對象只有:從 pending 變?yōu)?fulfilled 和從 pending 變?yōu)?rejected 的狀態(tài)改變。

只要處于 fulfilled 和 rejected ,狀態(tài)就不會再變了即 resolved(已定型)。

3.Promise的特點

一旦狀態(tài)改變,就不會再變,任何時候都可以得到這個結(jié)果。

Promise對象的狀態(tài)改變,只有兩種可能:從pending變?yōu)閒ulfilled和從pending變?yōu)閞ejected。

只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會再變了,會一直保持這個結(jié)果,這時就稱為 resolved(已定型)。

4.promise的方法

方法 類型 簡介
Promise.prototype.then() 原型方法 為 Promise 實例添加狀態(tài)改變時的回調(diào)函數(shù)
Promise.prototype.catch() 原型方法 為 Promise 實例指定發(fā)生錯誤時的回調(diào)函數(shù)
Promise.prototype.finally() 原型方法 用于指定不管 Promise 對象最后狀態(tài)如何,都會執(zhí)行的操作
Promise.resolve() 構(gòu)造函數(shù)方法 創(chuàng)建promise成功的實例
Promise.reject() 構(gòu)造函數(shù)方法 創(chuàng)建promise失敗的實例
Promise.all() 構(gòu)造函數(shù)方法 接收一個包含多個promise對象的數(shù)組,等待所有都完成時,返回存放他們結(jié)果的數(shù)組,如果任意一個被拒絕,則立即拋出錯誤,其他已完成的結(jié)果會被忽略
Promise.race() 構(gòu)造函數(shù)方法 接收一個包含多個promise對象的數(shù)組,等待第一個有結(jié)果(完成/拒絕)的promise,并把其result/error作為結(jié)果返回

5.promise使用場景

(1)同時拉去多個接口時

(2)數(shù)據(jù)量超大的接口回調(diào)處理

總結(jié):一般情況下,當(dāng)面試官問到這個問題的時候,我們只需要回答

promise解決了回調(diào)地獄的問題,promise有哪三種狀態(tài),promise的特點以及使用場景,

就可以啦,相信面試官會滿意這個答案的!

ps:如果幫助你啦,動動小手點個贊??吧!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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