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