摘要:下一篇大概就是源碼方面的學(xué)習(xí)筆記了龜速學(xué)習(xí)中這一次我是去看了下規(guī)范照例傳送門(mén)圖靈社區(qū)規(guī)范首先吧個(gè)人總結(jié)下該用的詞解決結(jié)婚拒絕婉拒終值值傳家寶拒因好人卡等等異常車(chē)禍理下概念我們的的就像是一場(chǎng)姻緣對(duì)吧解決呢就是結(jié)婚成功啦傳家寶也如愿的傳給下一代
下一篇大概就是源碼方面的學(xué)習(xí)筆記了...龜速學(xué)習(xí)中...
這一次我是去看了下Promises/A+規(guī)范
照例傳送門(mén):
圖靈社區(qū)Promises/A+規(guī)范 http://www.ituring.com.cn/art...
首先吧個(gè)人總結(jié)下該用的詞:
解決(fulfill/resolve): 結(jié)婚
拒絕(reject) 婉拒
終值/值(eventual value/value) 傳家寶
拒因(reason) 好人卡等等
異常(exception) 車(chē)禍
Promise
thenable
理下概念,我們的的promise就像是一場(chǎng)姻緣對(duì)吧,解決呢就是結(jié)婚成功啦,傳家寶也如愿的傳給下一代(等待下一場(chǎng)姻緣),婉拒了就是求婚失敗被人發(fā)好人卡啦,而結(jié)婚呢天災(zāi)人禍不可避免,而這些天災(zāi)人禍呢就是我們所說(shuō)的異常了.
大概我自己腦洞有點(diǎn)大吧,我們還是來(lái)看代碼吧
promise.then(onFulfilled, onRejected)
首先then的定義,
接收onFulfilled, onRejected兩個(gè)函數(shù)(不是函數(shù)就當(dāng)缺席),這個(gè)也是我們上篇所說(shuō)的then(undefined,onRejected)兼容catch的原因啦.
如果我們傳入的onFulfilled為函數(shù),則會(huì)接受promise的 終值/值(eventual value/value) 作為第一個(gè)參數(shù),并且只能在promise狀態(tài)為fulfilled時(shí)調(diào)用一次.同理我們的onRejected也差不多,重點(diǎn)是規(guī)定它們的一次性.
同一個(gè)promise可以多次調(diào)用then方法,但是要注意順序
then必須返回一個(gè)promise對(duì)象.
promise2 = promise1.then(onFulfilled, onRejected)
如果onFulfilled不是函數(shù)且promise1狀態(tài)為fulfilled,則promise2狀態(tài)為fulfilled且值與promise1的值相同
如果onRejected不是函數(shù)切promise1狀態(tài)為rejected,那么promise2狀態(tài)必須為rejected且與promise1的reason拒因相同.
不是上述情況,則
then后終值為x/或者說(shuō)promise1傳遞終值為x,則執(zhí)行[[Resolve]](promise2,x)
then拋出異常e,則將e作為拒因并設(shè)promise2為rejected
[[Resolve]](promise2,x)
這其實(shí)就是構(gòu)造出promise2的一個(gè)過(guò)程
X = promise的終值(傳遞過(guò)來(lái)的
promise2 = then返回的promise對(duì)象
如果x有then方法,并且看起來(lái)像是Promise,則嘗試使promise2接受x的狀態(tài);否則用x的值來(lái)**執(zhí)行**promise 這一條,其實(shí)包含在我們下面的流程里,不理解不要緊,我們先看整體.
x === promise2
拒因TypeError,執(zhí)行reject promise
x為Promise對(duì)象
嘗試讓promise2接收x的state(狀態(tài)) 如果x處于pending,則同步其狀態(tài) 如果x處于fulfilled,則用同樣的值來(lái)執(zhí)行fulfilled promise 如果x處于rejected,則用同樣的拒因來(lái)執(zhí)行reject promise
x為對(duì)象或者函數(shù)
typeof newValue === "object" || typeof newValue === "function"
var then = x.then (取值失敗就把異常e作為拒因,執(zhí)行reject promise) typeof then ==== "function" 如果then是函數(shù) --------------------------------------------- var newthen = then.bind(x) x作為then函數(shù)內(nèi)部的this指針. newthen(resolvePromise,resolvePromise) 如果resoleve被調(diào)用且值為y,則執(zhí)行[[Resolve]](promise2,y) 如果rejectPromise被調(diào)用且reason為r,則用r來(lái)reject promise 如果resolvePromise和rejectPromise都被調(diào)用,或者多次調(diào)用參數(shù)相同,則優(yōu)先采用首次調(diào)用!并且忽略剩下的調(diào)用 如果then 方法拋出異常e resolvePromise或rejectPromise已經(jīng)被調(diào)用,則忽略該異常 否則用e作為拒因來(lái)reject promise -------------------------------------------- 如果then不是函數(shù)類(lèi)型 用x來(lái)fulfill promise
如果x不是函數(shù)也不是對(duì)象
用x來(lái)fulfill promise
以我這么小的腦容量,還是挺難理解上面這串東西的,還是自己先理一下吧...
根據(jù)x的不同進(jìn)行不同處理,難點(diǎn)在于當(dāng)傳遞來(lái)的終值為thenable對(duì)象,我們就要對(duì)其進(jìn)行一定程度上的判斷處理,x.then為函數(shù)時(shí),我們需要將x作為then函數(shù)內(nèi)部的this指針,讓resolvePromise為第一個(gè)參數(shù),rejectPromise為第二個(gè)參數(shù),調(diào)用then函數(shù).(這里是在內(nèi)部)
然后這個(gè)x.then的執(zhí)行結(jié)果就是新的x...我們來(lái)弄個(gè)圖吧
大概就是這樣吧,其實(shí)就是內(nèi)部的自調(diào)用取終值,然后then的終止有出現(xiàn)在哪里呢
完成終止在fulfill promise.
x為Promise,x處于fulfilled,則用同樣的值來(lái)執(zhí)行fulfill promise
x為對(duì)象或函數(shù),x.then不是函數(shù)類(lèi)型,用x來(lái)fulfill promise
如果x不是函數(shù)也不是對(duì)象,用x來(lái)fulfill promise
失敗終止在reject promise
x === promise2,拒因TypeError,執(zhí)行reject promise
x為Promise,x處于rejected,則用同樣的拒因來(lái)執(zhí)行reject promise
x為對(duì)象或函數(shù),x.then取值失敗并得到一個(gè)異常e,那么將e作為拒因來(lái)執(zhí)行reject promise.
x為對(duì)象或函數(shù),x.then為函數(shù)類(lèi)型,rejectPromise被調(diào)用且reason為r,則用r來(lái)reject promise
x為對(duì)象或函數(shù),x.then為函數(shù)類(lèi)型,x.then拋出異常e并且 resolvePromise和rejectPromise沒(méi)有被調(diào)用,e作為拒因來(lái)reject promise
理解有錯(cuò)的話希望指出,在看完源碼看規(guī)范的循環(huán)中,以后寫(xiě)完源碼篇理解有所加深的話會(huì)回來(lái)進(jìn)行修改一下
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80366.html
摘要:源碼閱讀階段先理解根本吧想快點(diǎn)理解的話可以直接跳到下個(gè)標(biāo)題這部分根據(jù)理解將持續(xù)修改空函數(shù)用于判斷傳入構(gòu)造器的函數(shù)是否為空函數(shù)如果為空函數(shù)構(gòu)造一個(gè)對(duì)象并初始化狀態(tài)為終值回調(diào)狀態(tài)和隊(duì)列記錄內(nèi)部最后的一次錯(cuò)誤空對(duì)象標(biāo)識(shí)表示發(fā)生了錯(cuò)誤暴露模塊接口為 源碼閱讀階段 先理解Promise根本吧,想快點(diǎn)理解的話可以直接跳到下個(gè)標(biāo)題.這部分根據(jù)理解將持續(xù)修改. Promise(fn) function...
平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...
平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...
平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...
閱讀 1319·2021-09-27 13:56
閱讀 2351·2019-08-26 10:35
閱讀 3511·2019-08-23 15:53
閱讀 1859·2019-08-23 14:42
閱讀 1243·2019-08-23 14:33
閱讀 3572·2019-08-23 12:36
閱讀 1955·2019-08-22 18:46
閱讀 1006·2019-08-22 14:06