成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Promise學(xué)習(xí)筆記(二):規(guī)范

_Suqin / 2843人閱讀

摘要:下一篇大概就是源碼方面的學(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

相關(guān)文章

  • Promise學(xué)習(xí)筆記(三):源碼core.js解析(上)

    摘要:源碼閱讀階段先理解根本吧想快點(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...

    wuyangchun 評(píng)論0 收藏0
  • 2017年3月份前端資源分享

    平日學(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 -...

    ermaoL 評(píng)論0 收藏0
  • 2017年3月份前端資源分享

    平日學(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 -...

    kamushin233 評(píng)論0 收藏0
  • 2017年3月份前端資源分享

    平日學(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 -...

    yy736044583 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<