Promise掃盲貼
then
then函數(shù)可以return另一個(gè)promise:
const p1 = new Promise((resolve, reject) =>{ resolve('p1') }) const p2 = new Promise((resolve, reject) =>{ setTimeout(() =>{ resolve('p2') },3000) }) p1.then(res => { console.log(res) return p2 }).then(res =>{ // p2 resolve后才執(zhí)行 console.log(res) }) //p1 // 3s后輸出... // p2
那么這個(gè)p2就會(huì)代替當(dāng)前p1的狀態(tài),等到新的p2的狀態(tài)修改時(shí),下一個(gè)then才會(huì)執(zhí)行
catch
1. 作用
可以捕獲到promise程序執(zhí)行中的error,等同于 .then(null, rejection) 或 .then(undefined, rejection)
2. 可以獲取到的錯(cuò)誤
promise函數(shù)體中拋出的error。在promise resolve后,再拋出錯(cuò)誤,不會(huì)被捕獲
const p1 = new Promise((resolve,reject) => {throw new Error('error')}) p1.catch(error => console.log(error)) // Error: error
promise的reject操作
const p2 = new Promise((resolve,reject) => reject('rejected')) p2.catch(error => console.log(error)) // rejected
then 函數(shù)體中拋出的error
const p3 = new Promise((resolve,reject) => resolve('resolved')) p3.then(res =>{ throw new Error('error') }).catch(error => console.log(error)) // Error: error
then函數(shù)可以返回一個(gè)promise(如果沒(méi)有定義catch方法),如果這個(gè)promise函數(shù)體中有reject或者error,也可以捕獲到
3. 推薦使用catch方式捕獲錯(cuò)誤,而不是then的第二個(gè)參數(shù):
因?yàn)閏atch可以捕獲到它前面所有then方法中的錯(cuò)誤
finally
- 不管promise最后狀態(tài)如何,都會(huì)執(zhí)行的操作
- 沒(méi)有參數(shù),獲取不到當(dāng)前promise最后的狀態(tài)
Promise.all
1. 參數(shù)
參數(shù)不僅僅可以是數(shù)組,具有Iterator接口的對(duì)象都可以。
數(shù)組參數(shù)的每一個(gè)元素為promise實(shí)例,如果不是,就會(huì)調(diào)用Promise.resolve轉(zhuǎn)換為Promise實(shí)例
const obj = { [Symbol.iterator]() { let index = 0 return { next() { return { // promise對(duì)象 和 其他類型都可以 value: new Promise(resolve => resolve(index++)), done: index > 2 // value: index++, done: index > 2 } } } } } const p = Promise.all(obj) p.then(res => { console.log(res) // [0, 1] })
2. 狀態(tài)
const p = Promise.all([p1, p2, p3]);
p的狀態(tài)由p1、p2、p3決定,分成兩種情況:
- 只有p1、p2、p3的狀態(tài)都變成fulfilled,p的狀態(tài)才會(huì)變成fulfilled,此時(shí)p1、p2、p3的返回值組成一個(gè)數(shù)組,傳遞給p的回調(diào)函數(shù)。
- 只要p1、p2、p3之中有一個(gè)被rejected,p的狀態(tài)就變成rejected,此時(shí)第一個(gè)被reject的實(shí)例的返回值,會(huì)傳遞給p的回調(diào)函數(shù)。
3. catch
如果參數(shù)中的promise定義了catch方法,那么Promise.all()的catch就不會(huì)捕獲到錯(cuò)誤
Promise.race
- 只要p1、p2、p3之中有一個(gè)實(shí)例率先改變狀態(tài),p的狀態(tài)就跟著改變。那個(gè)率先改變的 Promise 實(shí)例的返回值,就傳遞給p的回調(diào)函數(shù)。
- 參數(shù)、catch規(guī)則同Promise.all
Promise.resolve
將現(xiàn)有對(duì)象轉(zhuǎn)為Promise對(duì)象。
1. 參數(shù)
- 參數(shù)為promise實(shí)例:原封不動(dòng)的返回這個(gè)實(shí)例。
- 參數(shù)為thenable對(duì)象:將它轉(zhuǎn)為promise對(duì)象,然后立即執(zhí)行它的then方法
- 參數(shù)不是thenable對(duì)象,或者是一個(gè)原始值:返回一個(gè)新的promise對(duì)象,狀態(tài)為resolved
- 沒(méi)有參數(shù):直接返回衣蛾resolved狀態(tài)的promise對(duì)象
Promise.reject
返回一個(gè)狀態(tài)為rejected的promise實(shí)例
Promise.reject()方法的參數(shù),會(huì)原封不動(dòng)地作為reject的理由,變成后續(xù)方法的參數(shù)
const thenable = { then(resolve, reject) { reject('error'); } }; Promise.reject(thenable) .catch(e => { console.log(e === thenable) }) // true e并不是'error'
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript實(shí)現(xiàn)簡(jiǎn)易加法計(jì)算器
這篇文章主要介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)易加法計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03詳解javascript立即執(zhí)行函數(shù)表達(dá)式IIFE
本文主要介紹了javascript立即執(zhí)行函數(shù)表達(dá)式IIFE的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02JavaScript遍歷DOM元素的常見(jiàn)方式示例
這篇文章主要介紹了JavaScript遍歷DOM元素的常見(jiàn)方式,涉及javascript中firstChild、lastChild、firstElementChild、nextElementSibling等函數(shù)遍歷dom元素相關(guān)使用技巧,需要的朋友可以參考下2019-02-02原生JS實(shí)現(xiàn)手動(dòng)輪播圖效果實(shí)例代碼
手動(dòng)輪播圖,為輪播圖中的一種,輪播圖主要有無(wú)縫輪播,手動(dòng)輪播,延遲輪播,切換輪播等等,輪播圖主要用于展現(xiàn)圖片,新出商品,詞條,又能美觀網(wǎng)頁(yè)。給網(wǎng)頁(yè)中增加動(dòng)態(tài)效果。接下來(lái)通過(guò)本文給大家分享原生JS實(shí)現(xiàn)手動(dòng)輪播圖的實(shí)例代碼,一起看看吧2018-11-11JS實(shí)現(xiàn)的自定義網(wǎng)頁(yè)拖動(dòng)類
這篇文章主要介紹了JS實(shí)現(xiàn)的自定義網(wǎng)頁(yè)拖動(dòng)類,涉及頁(yè)面元素響應(yīng)鼠標(biāo)事件動(dòng)態(tài)改變屬性的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-11-11javascript游戲開(kāi)發(fā)之《三國(guó)志曹操傳》零部件開(kāi)發(fā)(三)情景對(duì)話中仿打字機(jī)輸出文字
前兩講我告訴了大家如何使人物移動(dòng),那么今天我們就來(lái)看看如何實(shí)現(xiàn)仿《三國(guó)志曹操傳》人物情景對(duì)話,感興趣的朋友可以了解下,希望本文對(duì)你有所幫助2013-01-01