iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0

我們前面介紹了Promise的簡單建構函式用法,以及Promise函式可以使用的方法Promise.all、race、resolve、reject,以及Promise在處理非同步事件時的狀態,包含處理中pending、執行處理成功resolved、執行處理失敗rejected,而今天要介紹在Promise中使用resolve 或 reject 回傳結果後,用then、catch取得值。

Promise三種狀態

  • Pending-還在處理,沒有得到結果。
  • Resolved-事情執行完畢成功,回傳resolve結果。
  • Rejected-事件執行完畢失敗,回傳rejected結果。

不管是哪一種狀態,一定會有Pending的過程,而接下來就是兩種結果Fulfilled(成功)、Rejected(失敗)。並用then()及catch()取得成功或失敗的結果。

.then

我們在.then中可以帶入兩個參數,分別式onFulfilled及onRejected兩個函式,兩者函式都可以帶入自己的參數。
.then(onFulfilled, onRejected)。

  • onFulfilled-執行成功後函式,可自己帶入的參數為Promise函式resolve帶入的值。
  • onRejected-執行失敗後函式,可自己帶入的參數為Promise函式reject帶入的值。

範例:帶入.then(onFulfilled, onRejected)兩者參數,分別為成功及失敗。

promise()
  .then((success) => {
    console.log('成功');
  }, (fail) => {
    console.log('失敗');
  })

但習慣上我們使用.then()抓取成功的結果,失敗的部分由catch()抓取,這兩種寫法都可以。

promise()
  .then(success => {
    console.log('成功');
  })
  .catch(fail => {
    console.log('失敗');
  });

而.then及.catch不是只能有一個,可以有多個.then及.catch不斷執行接下來的任務,在這個範例中我們傳入數值0 會進入reject,其他都是成功resolve。

function promise(num) {
  return new Promise((resolve, reject) => {
    num ? resolve(`${num}, 成功`) : reject('失敗');
  });
}

我們可以透過return進入下一個.then裡面,執行接下來的任務,retrun方法不局限於promise函式,所有表達式都可以進行回傳,promise的話會依造then及catch的運作,如果不是promise的話,在下一個then可以取得結果。

promise(1)
  .then(success => {
    console.log(success);
    return promise(2);
  })
  .then(success => {
    console.log(success);
    return promise(0); // 帶入數值0,所以進入了catch
  })
  .then(success => {   // 上一個執行時進入了catch,所以這段不執行
    console.log(success);
    return promise(3);
  })
  .catch(fail => {
    console.log(fail);
  })

finally完成

除了.then()、.cathch()以外,最後還要介紹finally,finally不用帶入參數,可以運用在ajax取得遠端資料後,使用finally來關閉讀取效果。

promise(1)
  .then(success => {
    console.log(success);
  }).finally(() => {
    console.log('完成');
  })

那我們今天的介紹就到這邊了!明天再讓我們一起努力吧。


上一篇
Day25 Javascript Promise
下一篇
Day27 Javascript async與await
系列文
Javascripts惡補小教室30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言