ES6 Promise——then與catch的返回值實踐

如下是在學習Promise關於catch與then的疑惑總結javascript

一.catch爲then的語法糖

then方法與catch方法均會返回一個Promise對象(對,即便return 爲某個值,或者throw error,或者不返回值)
咱們來看看MDN的定義,這裏可能爲了嚴謹而說得有點亂七八糟的
clipboard.pnghtml

簡單來講,就是分爲return 值(無return的狀況下即返回undefined,也是返回值)throw errorreturn Promisejava

二.說說return值與throw error的狀況。

1.return 值的狀況:

返回的Promise會成爲Fulfilled狀態。
return的值會做爲新Promise對象下一個then的回調函數的參數值,貼代碼看例子promise

var example = new Promise((fulfill, reject)=>{
    let i = 1;
    fulfill(i);
})
example
.then((value)=>{ console.log(value); value++; return value;  })
.then((value) => {console.log(value);                        });

輸出結果以下:
clipboard.png函數

調用fufill函數return value會傳給下一個回調函數
回到上面的疑問,若是沒有return呢,那麼就會返回undefined
(就是函數無return返回的是undefined的狀況,基礎要紮實啊啊啊)學習

var example = new Promise((fulfill, reject)=>{
    let i = 1;
    fulfill(i);
})
example
.then((value)=>{ console.log(value); value++; })
.then((value) => {console.log(value);});

輸出結果以下:
clipboard.pngspa

2.throw error的狀況:

返回的Promise會成爲Rejected狀態,
下一步執行catch中的回調函數或者then的第二個回調函數參數code

這裏出現了以前一直搞混的東西。
再次重複這一句話:catch爲then的語法糖,它是then(null, rejection)的別名。
也就是說,catch也是then,它用於捕獲錯誤,它的參數也就是是then的第二個參數。
因此,假設catch中若是return 值的話,新的Promise對象也會是接受狀態。
看看例子:htm

var example = new Promise((fulfill, reject)=>{
    let i = 1;
    reject(i);
})
example
.catch(()=>{console.log('我是第一個catch的回調函數'); return 1;})
.then(() =>{console.log('我是第一個then的回調函數');    throw Error    })
.catch(()=>{console.log('我是第二個catch的回調函數')})
.then(() => {console.log('我是第二個then的回調函數')})

結果以下圖:
clipboard.png
調用reject函數後,promise變爲rejected狀態,故執行第一個catch的回調函數
第一個catch的回調函數return 1,故執行第一個then的回調函數
第一個then的回調函數throw Error,故執行第二個catch的回調函數
第二個catch的回調函數ruturn undefined(如上文所言),故執行第二個then的回調函數對象

3.return Promise的狀況

至於return Promise的狀況下,其實同理啦,我只是剛開始接觸Promise語法時感到不是很適應:居然會自動爲你生成Promise對象?!後來看了部分源碼剖析後才大體知道爲何會這樣子,連接也放下面吧

連接:
MDN:catch:https://developer.mozilla.org...
MDN:then:https://developer.mozilla.org...
Promise實現:https://tech.meituan.com/prom...

相關文章
相關標籤/搜索