promise理解,promise有關(guān)面試記錄

promise含義

本質(zhì)上,一個(gè)promise是某個(gè)函數(shù)返回的對(duì)象,你可以把回調(diào)函數(shù)綁定在這個(gè)對(duì)象上,而不是把回調(diào)函數(shù)當(dāng)作參數(shù)傳進(jìn)函數(shù)。

promise/A+規(guī)范

  1. 一個(gè)promise可能有三種狀態(tài):等待(pending)、已完成(fulfilled)、已拒絕(rejected)
  2. 一個(gè)promise的狀態(tài)只可能從“等待”轉(zhuǎn)到“完成”態(tài)或者“拒絕”態(tài),不能逆向轉(zhuǎn)換,同時(shí)“完成”態(tài)和“拒絕”態(tài)不能相互轉(zhuǎn)換
  3. promise必須實(shí)現(xiàn)then方法(可以說,then就是promise的核心),而且then必須返回一個(gè)promise,同一個(gè)promise的then可以調(diào)用多次,并且回調(diào)的執(zhí)行順序跟它們被定義時(shí)的順序一致
  4. then方法接受兩個(gè)參數(shù),第一個(gè)參數(shù)是成功時(shí)的回調(diào),在promise由“等待”態(tài)轉(zhuǎn)換到“完成”態(tài)時(shí)調(diào)用,另一個(gè)是失敗時(shí)的回調(diào),在promise由“等待”態(tài)轉(zhuǎn)換到“拒絕”態(tài)時(shí)調(diào)用。同時(shí),then可以接受另一個(gè)promise傳入,也接受一個(gè)“類then”的對(duì)象或方法,即thenable對(duì)象。

promise API

方法:
1. Promise.resolve()—— 返回一個(gè)promise對(duì)象

注意點(diǎn):
1、返回一個(gè)狀態(tài)由給定value決定的Promise對(duì)象(有三種value類型)。
2、類型一,value值是一個(gè)Promise對(duì)象,則直接返回該對(duì)象
3、類型二,value值是thenable(即,帶有then方法的對(duì)象),返回的Promise對(duì)象的最終狀態(tài)由then方法執(zhí)行決定
4、類型三,value值為空、基本類型或者不帶then方法的對(duì)象,返回的Promise對(duì)象狀態(tài)為fulfilled,并且將該value傳遞給對(duì)應(yīng)的then方法。
5、使用場(chǎng)景:如果不知道一個(gè)值是否是Promise對(duì)象,使用Promise.resolve(value) 來返回一個(gè)Promise對(duì)象,這樣就能將該value以Promise對(duì)象形式使用。

2. Promise.reject()——返回一個(gè)狀態(tài)為失敗的promise對(duì)象
返回一個(gè)狀態(tài)為失敗的Promise對(duì)象,并將給定的失敗信息傳遞給對(duì)應(yīng)的處理方法

3. Promise.all(iterable)—— 所有成功才成功,一個(gè)失敗即失敗

注意點(diǎn):
1、該方法返回一個(gè)新的promise對(duì)象,只有所有的對(duì)象成功,才會(huì)觸發(fā)成功,只要有一個(gè)失敗,就會(huì)觸發(fā)該對(duì)象失敗。
2、如果該promise對(duì)象成功,會(huì)把一個(gè)包含iterable里所有promise返回值的數(shù)組作為成功回調(diào)的返回值,順序跟iterable的順序保持一致
3、如果該promise對(duì)象失敗,它會(huì)把iterable里第一個(gè)觸發(fā)失敗的promise對(duì)象的錯(cuò)誤信息作為它的失敗錯(cuò)誤信息。
4、Promise.all方法常被用于處理多個(gè)promise對(duì)象的狀態(tài)集合。

4. Promise.race(iterable)——競(jìng)速,最快的一個(gè)

注意點(diǎn):
1、只要有任意一個(gè)子promise成功或失敗,就會(huì)觸發(fā)父promise對(duì)應(yīng)的狀態(tài),并返回該promise對(duì)象
2、第一個(gè)promise對(duì)象變?yōu)镕ulfilled之后,并不會(huì)取消其他promise對(duì)象的執(zhí)行。只是只有先完成的Promise才會(huì)被Promise.race后面的then處理。其它的Promise還是在執(zhí)行的,只不過是不會(huì)進(jìn)入到promise.race后面的then內(nèi)。

原型方法:
1. Promise.prototype.then(resolved,rejected)

注意點(diǎn):
1、then有兩個(gè)參數(shù),第一個(gè)參數(shù)是resolved狀態(tài)的回調(diào)函數(shù),第二個(gè)參數(shù)(可選)是rejected狀態(tài)的回調(diào)函數(shù)
2、then返回的是一個(gè)新的 promise, 將以回調(diào)的返回值來resolve.

2. Promise.prototype.catch()

注意點(diǎn):
1、添加一個(gè)拒絕(rejection) 回調(diào)到當(dāng)前 promise, 返回一個(gè)新的promise,因此catch后面還可以接著調(diào)用then方法。(catch只是then的語法糖,相當(dāng)于.then(null, rejection)的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。)
2、當(dāng)這個(gè)回調(diào)函數(shù)被調(diào)用,新 promise 將以它的返回值來resolve,否則如果當(dāng)前promise 進(jìn)入fulfilled狀態(tài),則以當(dāng)前promise的完成結(jié)果作為新promise的完成結(jié)果.(即如果在resolve后再throw錯(cuò)誤,是不會(huì)被catch到的,因?yàn)闋顟B(tài)改變后不可逆
3、Promise 對(duì)象的錯(cuò)誤具有“冒泡”性質(zhì),會(huì)一直向后傳遞,直到被捕獲為止。(無論前面有多少個(gè)then,它們拋出的錯(cuò)誤總是會(huì)被下一個(gè)catch語句捕獲。
4、當(dāng)catch前后都有多個(gè)then的時(shí)候,只有catch前面的then們發(fā)生了錯(cuò)誤才會(huì)進(jìn)入catch,否則跳過catch,繼續(xù)執(zhí)行catch后面的then(只有rejected才會(huì)進(jìn)入catch,否則跳過
5、catch方法之中,還能再拋出錯(cuò)誤。如果只有一個(gè)catch,當(dāng)catch發(fā)生錯(cuò)誤時(shí),這個(gè)錯(cuò)誤不會(huì)被捕獲,也不會(huì)傳遞到外層。如果有多個(gè)catch連寫,那么下一個(gè)catch就會(huì)捕獲上一個(gè)catch的錯(cuò)誤。

3. Promise.prototype.finally()

注意點(diǎn)
1、finally() 方法的回調(diào)函數(shù)不接受任何參數(shù)
2、無論成功還是失敗都會(huì)執(zhí)行
3 、finally() 方法總是會(huì)返回原來的值。

面試有關(guān)

1、說說promise規(guī)范
2、關(guān)于catch的一系列提問,如catch后還能不能再catch到錯(cuò)誤,catch后還能不能繼續(xù)寫then,then后面的catch還能不能catch到then的錯(cuò)誤之類的。

  1. 如果異步操作拋出錯(cuò)誤,狀態(tài)就會(huì)變?yōu)镽ejected,就會(huì)調(diào)用catch方法指定的回調(diào)函數(shù),處理這個(gè)錯(cuò)誤。
  2. then方法指定的回調(diào)函數(shù),如果運(yùn)行中拋出錯(cuò)誤,也會(huì)被catch方法捕獲。
  3. 在resolve()后面拋出的錯(cuò)誤會(huì)被忽略(如果前面已經(jīng)是執(zhí)行了resolve,那么后面throw 出來的error不會(huì)被catch到)
  4. catch方法返回的還是一個(gè)Promise對(duì)象,因此后面還可以接著調(diào)用then方法。
  5. 在異步函數(shù)中拋出的錯(cuò)誤不會(huì)被catch捕獲到(例如使用了setTimeout之類的,拋出來的錯(cuò)誤不會(huì)被catch到)
  6. 有多個(gè)catch連寫,如果在catch中繼續(xù)throw出異常,那么后面的catch就會(huì)一直執(zhí)行,如果不throw異常,則不會(huì)執(zhí)行(catch其實(shí)是then的語法糖)

3、 現(xiàn)有4個(gè)接口地址/a,/b,/c,/d,需要測(cè)試出當(dāng)中的相應(yīng)速度(處理完成并返回結(jié)果)最快的一個(gè)接口的耗時(shí),請(qǐng)寫出實(shí)現(xiàn)過程,可以使用setTimeout來模擬異步請(qǐng)求。

var promise1 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 500, 'one');
});

var promise2 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then(function(value) {
  console.log(value);
  // Both resolve, but promise2 is faster
});
// expected output: "two"

  1. setTimeout、async、promise執(zhí)行順序是如何的
    https://blog.csdn.net/baidu_33295233/article/details/79335127

參考:
使用Promise
Promise
Promise對(duì)象

最后編輯于
?著作權(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)容

  • Promise 對(duì)象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,830評(píng)論 1 56
  • title: promise總結(jié) 總結(jié)在前 前言 下文類似 Promise#then、Promise#resolv...
    JyLie閱讀 12,416評(píng)論 1 21
  • 一、Promise的含義 Promise在JavaScript語言中早有實(shí)現(xiàn),ES6將其寫進(jìn)了語言標(biāo)準(zhǔn),統(tǒng)一了用法...
    Alex灌湯貓閱讀 887評(píng)論 0 2
  • 本文適用的讀者 本文寫給有一定Promise使用經(jīng)驗(yàn)的人,如果你還沒有使用過Promise,這篇文章可能不適合你,...
    HZ充電大喵閱讀 7,452評(píng)論 6 19
  • 沙棘可以控制消化系統(tǒng)疾病 消化系統(tǒng)是人體不大系統(tǒng)之一,貫穿從食物入口到消化吸收的全部過程,俗話說“病從口入”就是這...
    小艾沙沙閱讀 2,111評(píng)論 0 0

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