Hello everybody。我又來啦,還記得我們上一張實現(xiàn)的內容嗎?

????上一張我們實現(xiàn)了一個簡單的Promise。我們實現(xiàn)了Promise內部的簡單流程和then方法,并且實現(xiàn)了Promise的異步調用。但是我們也留下了一些問題。。。
由于今天的代碼是基于上一次我們實現(xiàn)的內容,所以不甚了解的小伙伴們可以去看我上一篇文章。。
文章地址:一步一步實現(xiàn)一個符合PromiseA+規(guī)范的Promise庫(1)
問題一:then方法的鏈式調用
我們都知道,一個Promise是可以在其中再次返回Promise的(當然也可以返回一個普通的值)。而且呢,返回的Promise或者返回的普通值我們需要去拿到它的值并且回傳給我們下一次的then方法中。比如:

當然我們也可以在then方法中返回一個Promise;

所以問題就來了。
問題二:如果在then方法中返回Promise或者普通值的情況,我們需要怎么處理。
so,開搞。
我們先來處理第一個問題,讓我們的then方法支持鏈式調用,并且能接受普通值。
我們先來修改then方法中的對于成功狀態(tài)(onfulfilled)的判斷,因為下面的跟他是相同的道理。

這里我們首先來看定義的Promise2。為什么要定義這樣一個變量呢?
我們要知道,如果要實現(xiàn)Promise中then方法的鏈式調用。當?shù)谝粋€then運行完畢并且把返回值給我們之后,我們也要返回這個值。
我們不禁要問了?一個值怎么怎么會有then方法呢?所以我們要把這個值包裝成一個Promise對象給返回出去。
所以說,我們需要使每個狀態(tài)都返回一個Promise。。說的有點多。我們來測試一下。

我們接著改下面兩個狀態(tài)。

我們來捋一捋。通過測試。

我們看到代碼運行了2.496秒,我們的測試結果是正確的;
到這里我們就解決了then方法鏈式調用并且在then方法中返回一個普通值到下一次then方法的成功狀態(tài)中。

接下來我們解決第二個問題。我們是需要允許在then方法中返回Promise的。。所以,我們也要處理這種情況。
Let ?us ?try to do it

其實很簡單,我們需要一個統(tǒng)一的處理函數(shù)來進行在then中返回Promise的處理。。
我們先新建一個方法叫做resolvePromise(Promise的決定)

在規(guī)范中說道。

什么意思呢,就是說如果Promise2和x指向的是同一個對象,我們這里就要把需要返回的Promise2置為reject并且要返回一個類型錯誤??聪旅娴拇a

然后我們描述一下細節(jié)。。


這TM有點細節(jié)。。
好了不逗了,我們在代碼里面分析的很清楚了。我們來捋一捋思路。
在then方法中是可以返回一個Promise的對吧,然后我們拿到了then方法的執(zhí)行結果,也就是可能是一個Promise或者是一個普通值(也就是x)。然后我們對這個x進行判斷,我們首先要判斷這個x是不是一個Promise對吧。
如果不是我們可以直接返回x,如果是的話,我們應該知道,Promise都會有then方法。我們接下來就需要判斷這個then方法是不是一個function。如果不是我們就直接返回這個then的值,emmm...他應給就是一個普通值。
如果這個then方法是一個function我們就可以直接去執(zhí)行他。我們在兩個回調中進行操作,如果執(zhí)行的是onfulfilled則我們進行了關鍵的一步,就是遞歸調用我們的resolvePromise方法去看我們的onfulfilled傳進來的參數(shù)是否還是一個Promise,,就這樣一直調用,,直到x或者x.then是一個普通的值為止,然后我們就可以返回這個值,也就是resolve我們最后的值。
當然我們這里加了try{}catch(){}還是為了避免程序運行中的錯誤。
然后我們就可以把我們之前的狀態(tài)判斷中的resolve替換成我們的resolvePromise方法,例如:

當然下面的pending狀態(tài)也是一樣的。

到這里我們的Promise已經(jīng)實現(xiàn)的差不多了。但是還有一個問題。我們思考以下代碼;

上面代碼用的是ES6的原生的Promise
what?我們可以看到,第一個then方法中并沒有任何東西,然而我們第二個then中卻拿到了promies中resolve的值。
我們都知道,then方法中有onfulfilled和onreject兩個回調函數(shù),所以我們要處理一下這兩個回調函數(shù)。

我們可以在then方法中處理一下這兩個回調。判斷一下他們的類型,如果類型是function就代表這兩個回調是有東西的。不然呢我們就返回一個默認的匿名函數(shù),這個函數(shù)的參數(shù)就是上一次Promise返回的值,也就是當我們再次執(zhí)行onfulfilled或者onrejected的時候就可以直接拿到這個值了。也就完成了我們想要的效果。
現(xiàn)在,我們基本上就實現(xiàn)了一個比較完整地Promise。我們實現(xiàn)了Promise異步調用,在then方法中返回Promise或者值,實現(xiàn)了then方法中可以沒有回調函數(shù)也能把執(zhí)行結果傳入下一次的then方法中。
當然我們基本清楚了Promise的基本原理,以后我們就可以說我們既會使用又可以實現(xiàn)一個Promise。

當然還有一些小小的問題,就是Promise中有許多方法我們沒有實現(xiàn)。例如:
Promise.resolve() . ? Promise.reject() ?..還有.catch()方法 ?Promise.all()方法等等
在下一篇文章中,我們會一一的去實現(xiàn)這些方法,并且會介紹一下前端開發(fā)這些年的異步發(fā)展流程
最初的callback->Promise->generator函數(shù)->我們現(xiàn)在常用的 async await
好了,就到這里吧??吹竭@里蠻不容易,謝謝大家。

忘了更新下篇文章地址了。。