導(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í)行的機制疾层,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é)果處理
- 通過一張圖來更好的理解異步和同步的概念:
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:如果幫助你啦贴硫,動動小手點個贊??吧椿每!