国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

_Suqin / 2844人閱讀

摘要:下一篇大概就是源碼方面的學(xué)習(xí)筆記了龜速學(xué)習(xí)中這一次我是去看了下規(guī)范照例傳送門圖靈社區(qū)規(guī)范首先吧個(gè)人總結(jié)下該用的詞解決結(jié)婚拒絕婉拒終值值傳家寶拒因好人卡等等異常車禍理下概念我們的的就像是一場姻緣對吧解決呢就是結(jié)婚成功啦傳家寶也如愿的傳給下一代

下一篇大概就是源碼方面的學(xué)習(xí)筆記了...龜速學(xué)習(xí)中...

這一次我是去看了下Promises/A+規(guī)范
照例傳送門:
圖靈社區(qū)Promises/A+規(guī)范 http://www.ituring.com.cn/art...

首先吧個(gè)人總結(jié)下該用的詞:

解決(fulfill/resolve): 結(jié)婚

拒絕(reject) 婉拒

終值/值(eventual value/value) 傳家寶

拒因(reason) 好人卡等等

異常(exception) 車禍

Promise

thenable

理下概念,我們的的promise就像是一場姻緣對吧,解決呢就是結(jié)婚成功啦,傳家寶也如愿的傳給下一代(等待下一場姻緣),婉拒了就是求婚失敗被人發(fā)好人卡啦,而結(jié)婚呢天災(zāi)人禍不可避免,而這些天災(zāi)人禍呢就是我們所說的異常了.

大概我自己腦洞有點(diǎn)大吧,我們還是來看代碼吧

promise.then(onFulfilled, onRejected)

首先then的定義,

接收onFulfilled, onRejected兩個(gè)函數(shù)(不是函數(shù)就當(dāng)缺席),這個(gè)也是我們上篇所說的then(undefined,onRejected)兼容catch的原因啦.

如果我們傳入的onFulfilled為函數(shù),則會接受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對象.

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/或者說promise1傳遞終值為x,則執(zhí)行[[Resolve]](promise2,x)

then拋出異常e,則將e作為拒因并設(shè)promise2為rejected

[[Resolve]](promise2,x)
這其實(shí)就是構(gòu)造出promise2的一個(gè)過程
X = promise的終值(傳遞過來的
promise2 = then返回的promise對象

如果x有then方法,并且看起來像是Promise,則嘗試使promise2接受x的狀態(tài);否則用x的值來**執(zhí)行**promise

這一條,其實(shí)包含在我們下面的流程里,不理解不要緊,我們先看整體.

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為對象或者函數(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來reject promise
    如果resolvePromise和rejectPromise都被調(diào)用,或者多次調(diào)用參數(shù)相同,則優(yōu)先采用首次調(diào)用!并且忽略剩下的調(diào)用
    如果then 方法拋出異常e
        resolvePromise或rejectPromise已經(jīng)被調(diào)用,則忽略該異常
        否則用e作為拒因來reject promise
 --------------------------------------------
 如果then不是函數(shù)類型
     用x來fulfill promise

如果x不是函數(shù)也不是對象

用x來fulfill promise

以我這么小的腦容量,還是挺難理解上面這串東西的,還是自己先理一下吧...
根據(jù)x的不同進(jìn)行不同處理,難點(diǎn)在于當(dāng)傳遞來的終值為thenable對象,我們就要對其進(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...我們來弄個(gè)圖吧

大概就是這樣吧,其實(shí)就是內(nèi)部的自調(diào)用取終值,然后then的終止有出現(xiàn)在哪里呢

完成終止在fulfill promise.

x為Promise,x處于fulfilled,則用同樣的值來執(zhí)行fulfill promise

x為對象或函數(shù),x.then不是函數(shù)類型,用x來fulfill promise

如果x不是函數(shù)也不是對象,用x來fulfill promise

失敗終止在reject promise

x === promise2,拒因TypeError,執(zhí)行reject promise

x為Promise,x處于rejected,則用同樣的拒因來執(zhí)行reject promise

x為對象或函數(shù),x.then取值失敗并得到一個(gè)異常e,那么將e作為拒因來執(zhí)行reject promise.

x為對象或函數(shù),x.then為函數(shù)類型,rejectPromise被調(diào)用且reason為r,則用r來reject promise

x為對象或函數(shù),x.then為函數(shù)類型,x.then拋出異常e并且 resolvePromise和rejectPromise沒有被調(diào)用,e作為拒因來reject promise

理解有錯(cuò)的話希望指出,在看完源碼看規(guī)范的循環(huán)中,以后寫完源碼篇理解有所加深的話會回來進(jìn)行修改一下

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/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è)對象并初始化狀態(tài)為終值回調(diào)狀態(tài)和隊(duì)列記錄內(nèi)部最后的一次錯(cuò)誤空對象標(biāo)識表示發(fā)生了錯(cuò)誤暴露模塊接口為 源碼閱讀階段 先理解Promise根本吧,想快點(diǎn)理解的話可以直接跳到下個(gè)標(biāo)題.這部分根據(jù)理解將持續(xù)修改. Promise(fn) function...

    wuyangchun 評論0 收藏0
  • 2017年3月份前端資源分享

    平日學(xué)習(xí)接觸過的網(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 評論0 收藏0
  • 2017年3月份前端資源分享

    平日學(xué)習(xí)接觸過的網(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 評論0 收藏0
  • 2017年3月份前端資源分享

    平日學(xué)習(xí)接觸過的網(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 評論0 收藏0

發(fā)表評論

0條評論

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