如下是在學習Promise關於catch與then的疑惑總結javascript
故then方法與catch方法均會返回一個Promise對象
(對,即便return 爲某個值,或者throw error,或者不返回值)
咱們來看看MDN的定義,這裏可能爲了嚴謹而說得有點亂七八糟的html
簡單來講,就是分爲return 值(無return的狀況下即返回undefined,也是返回值)
,throw error
, return Promise
java
返回的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); });
輸出結果以下:函數
調用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);});
輸出結果以下:spa
返回的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的回調函數')})
結果以下圖:
調用reject函數後,promise變爲rejected狀態,故執行第一個catch的回調函數
第一個catch的回調函數return 1
,故執行第一個then的回調函數
第一個then的回調函數throw Error
,故執行第二個catch的回調函數
第二個catch的回調函數ruturn undefined(如上文所言)
,故執行第二個then的回調函數
對象
至於return Promise的狀況下,其實同理啦,我只是剛開始接觸Promise語法時感到不是很適應:居然會自動爲你生成Promise對象?!後來看了部分源碼剖析後才大體知道爲何會這樣子,連接也放下面吧
連接:
MDN:catch:https://developer.mozilla.org...
MDN:then:https://developer.mozilla.org...
Promise實現:https://tech.meituan.com/prom...