Promise學習筆記 二 規範

2021-09-18 02:24:33 字數 3051 閱讀 9932

這一次我是去看了下promises/a+規範

照例傳送門:

圖靈社群promises/a+規範

首先吧個人總結下該用的詞:

解決(fulfill/resolve): 結婚

拒絕(reject)婉拒

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

拒因(reason)好人卡等等

異常(exception)車禍

promise

thenable

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

大概我自己腦洞有點大吧,我們還是來看**吧

promise.then(onfulfilled, onrejected)
首先then的定義,

promise2 = promise1.then(onfulfilled, onrejected)
如果onfulfilled不是函式promise1狀態為fulfilled,則promise2狀態為fulfilled且值與promise1的值相同

如果onrejected不是函式promise1狀態為rejected,那麼promise2狀態必須為rejected且與promise1的reason拒因相同.

不是上述情況,則

then後終值為x/或者說promise1傳遞終值為x,則執行[[resolve]](promise2,x)

then丟擲異常e,則將e作為拒因並設promise2為rejected

[[resolve]](promise2,x)

這其實就是構造出promise2的乙個過程

x = promise的終值(傳遞過來的

promise2 = then返回的promise物件

如果x有then方法,並且看起來像是promise,則嘗試使promise2接受x的狀態;否則用x的值來**執行**promise

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

x === promise2

拒因typeerror,執行reject promise
x為promise物件

嘗試讓promise2接收x的state(狀態)

如果x處於pending,則同步其狀態

如果x處於fulfilled,則用同樣的值來執行fulfilled promise

如果x處於rejected,則用同樣的拒因來執行reject promise

x為物件或者函式typeof newvalue === 'object' || typeof newvalue === 'function'

var then = x.then (取值失敗就把異常e作為拒因,執行reject promise)

typeof then ==== 'function' 如果then是函式

---------------------------------------------

var newthen = then.bind(x) x作為then函式內部的this指標.

newthen(resolvepromise,resolvepromise)

如果resoleve被呼叫且值為y,則執行[[resolve]](promise2,y)

如果rejectpromise被呼叫且reason為r,則用r來reject promise

如果resolvepromise和rejectpromise都被呼叫,或者多次呼叫引數相同,則優先採用首次呼叫!並且忽略剩下的呼叫

如果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的執行結果就是新的x...我們來弄個圖吧

大概就是這樣吧,其實就是內部的自呼叫取終值,然後then的終止有出現在**呢

完成終止在fulfill promise.

失敗終止在reject promise

理解有錯的話希望指出,在看完原始碼看規範的迴圈中,以後寫完原始碼篇理解有所加深的話會回來進行修改一下

Promise學習筆記

promise 表示乙個非同步操作的最終結果,與之進行互動的方式主要是then方法,該方法註冊了兩個 函式,用於接收 promise 的終值或本 promise 不能執行的原因。乙個 promise 的當前狀態必須為以下三種狀態中的一種 等待態 pending 執行態 fulfilled 和拒絕態 ...

Promise學習筆記(一)

前言 一開始學習前端的時候,很多技術都是學習其用法,實際上很少去了解其原理,因此在空閒時,去寫一些筆記記錄一下自己對一些常用技術的原理理解。什麼是promise?promise 是es6提供的乙個物件,promise物件代表了未來將要發生的事件,用來傳遞非同步操作的訊息 常用在網路請求中。promi...

c 程式設計規範學習筆記(二)

一次只解決乙個問題 只給乙個實賦予乙個定義良好的職責。軟體簡單為美 正確優於速度,簡單優於複雜,清晰優於技巧。使用靈活 動態分配的資料,不要使用固定大小的陣列 了解演算法的實際複雜度 優先使用線性演算法或盡可能快的演算法 盡可能避免劣於線性複雜度的演算法 永遠不要使用指數複雜度的演算法,除非你別無選...