通俗淺顯的理解Promise中的then

2022-09-02 15:54:19 字數 2854 閱讀 6112

promise,es6中定義的規範,不會使用promise,都不敢說自己用過es6,大部分介紹promise的規範的文章對於新手小白來說看得雲裡霧裡,且並不是通俗易懂。本文通過例項介紹講述promise中then的的最通俗應用理解,**建立在不出現異常的情況的操作下,不嚴謹之處,請以官方規範為標準。

先看一下下面4個promise到底有什麼區別呢?

func().then(function

() );

func().then(

function

() );

func().then(cb());

func().then(cb);

如果你知道答案,以下內容你可以不用繼續。

上面的**過於簡單,執行時話需要稍微進行一點擴充套件,每個方法中都列印出promise上一步的呼叫值,為了方便我給每個方法加了乙個下標輸出,分別是1、2、3、4。

let func = function

() );

};let cb = function

() func().then(

function

() ).then(resp =>);

func().then(

function

() ).then(resp =>);

func().then(cb()).then(resp =>);

func().then(cb).then(resp =>);

不賣關子,直接看結果

首先要明白promise中then方法會幹什麼事情!

規範文件是這樣定義的:

乙個 promise 必須提供乙個 then 方法以訪問其當前值、終值和據因。

promise 的 then 方法接受兩個引數:

promise.then(onfulfilled, onrejected) todo:這裡只介紹onfulfilled,所以刪除了關於onrejected的規範定義

onfulfilled 和 onrejected 都是可選引數。

如果 onfulfilled 不是函式,其必須被忽略。

如果 onfulfilled 是函式:當 promise 執行結束後其必須被呼叫,其第乙個引數為 promise 的終值

在 promise 執行結束前其不可被呼叫

其呼叫次數不可超過一次

用通(ren)俗(hua)的話來說:then方法提供乙個供自定義的**函式,若傳入非函式,則會忽略當前then方法。

**函式中會把上乙個then中返回的值當做引數值供當前then方法呼叫。

then方法執行完畢後需要返回乙個新的值給下乙個then呼叫(沒有返回值預設使用undefined)。

每個then只可能使用前乙個then的返回值。

直觀的圖:

有了上面的定義我們帶著三個疑問來回答問題:

上乙個then中傳入了**函式嗎?

上乙個then中提供了返回值嗎?

若上乙個then中若提供了返回值,返回了什麼?

執行第乙個方法:

顯而易見,是傳入了**函式的

**函式中把cb執行後的返回值當做then中的返回值,所以輸出了「新的值」;

執行第二個方法:

func().then(function () ).then(resp => );

function () 

then**方法,只是執行了cb方法,並沒有return值,定義中講過若then沒有返回值,提供給下乙個then使用的引數就是undefined,所以列印出來的是undefined;

執行第三個方法:

func().then(cb()).then(resp => );

func().then(cb())

then中cb()執行後返回的並不是乙個函式,在promise規範中會自動忽略調當前then,所以會把func中的返回值供下乙個then使用,輸出了「返回值」

執行第四個方法:

func().then(cb).then(resp => );

func().then(cb)

第乙個方法在**內部返回cb執行後的值,第四個方法則直接把cb當做**,第乙個方法與第四個方法異曲同工之妙,所以也輸出了「新的值」。

題目出處:

promise規範:

**:

對TCP IP的淺顯理解

前段時間做了乙個開發,涉及到網路程式設計,開發過程比較順利,但任務完成後始終覺得有一些疑惑。主要是因為對網路協議不太熟悉,對一些概念也沒弄清楚。後來 我花了一些時間去了解這些網路協議,現在對tcp ip網路協議有了初步的認識,在這裡總結出來,可以梳理一下我對網路協議的理解,加深印象.話說兩台電腦要通...

PHP中控制代碼的通俗理解

ps 本人親測,阿里雲2核4g5m的伺服器價效比很高,新使用者一塊多一天,老使用者三塊多一天,最高可以買三年,感興趣的可以戳一下 阿里雲折扣伺服器 就是個鍋把 你想,你做飯不能總端著鍋吧?得握著鍋把,因為鍋太大了,不好拿。控制代碼也是這個道理,開啟乙個資源,這個資源特別大,可能是個好幾g的檔案,ph...

numpy中axis的通俗理解

numpy中的axis與shape有關,shape為乙個tuple,這個tuple的index即為所在的axis。例如乙個ndarray形狀為 4,3,2 則4對應的axis為0,3對應的axis為1,2對應的axis為2。import numpy as np x np.arange 24 resh...