這一次我是去看了下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 程式設計規範學習筆記(二)
一次只解決乙個問題 只給乙個實賦予乙個定義良好的職責。軟體簡單為美 正確優於速度,簡單優於複雜,清晰優於技巧。使用靈活 動態分配的資料,不要使用固定大小的陣列 了解演算法的實際複雜度 優先使用線性演算法或盡可能快的演算法 盡可能避免劣於線性複雜度的演算法 永遠不要使用指數複雜度的演算法,除非你別無選...