iT邦幫忙

0

Javascript 進階 11-2 Promise 基礎概念

  • 分享至 

  • xImage
  •  

這篇文章要來介紹 Promise 的運行概念

https://ithelp.ithome.com.tw/upload/images/20200525/20121770bpv6FHTLEd.png

基本上,Promise 在運行非同步事件的時候都會有幾個狀態,我們透過下方的圖示來解說一下

https://ithelp.ithome.com.tw/upload/images/20200525/20121770nJltmowXqt.png

首先不論如何,一開始都會有 pending 的狀態,也就是非同步行為還沒有確定結果,以 ajax 的範例來說,就是你送出了請求,但對方還沒回應,或是資料正在傳輸的等待時間段。

再來,因應資料回傳的結果,就有分成 成功 以及 失敗,很好理解~

成功就是會讓 Promise 走到 fullfilled 的狀態,代表連線跟其他設定都沒問題,並且成功取回請求的資料。

那麼成功時所告訴 Promise 成功的語法就是 resolve(帶入成功要回傳的資訊);

失敗就是 rejected 的狀態,有可能是伺服器有問題,資料庫有問題,連線有問題等等等的,反正就沒有拿到你想要的資料。

失敗的話則是 reject(帶入失敗要回傳的資訊)

而不論成功或是失敗,都是屬於已經有結果的狀態,這樣的分類也同時稱作 settled 的狀態。

接著我們可以透過下面的簡單範例,來跟大家說明一下,Promise 的狀態,以及運行順序。

function promiseFn (num) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (num) {
                resolve('成功');
            } else {
                reject(new Error('失敗'));
            }
        }, 0);
    });
}

promiseFn(1)
    .then((res) => {
        console.log(res);
    })
    .catch((err) => {
        console.error(err);
    });

大家可以看到一開始,我們先宣告了一個 promiseFn 的函式,裡面就是 return 了 Promise 的物件,而這個物件裡面包著的是 setTimeout 的非同步事件。

並且在非同步事件中,我們判斷傳進來的數字是否為 falsy 或是 truthy 進行成功以及失敗字樣的回傳。

下方就是執行的內容,而如果是成功的狀態,我們可以使用 then 去承接成功的狀態所回傳的資料,以這邊來說就是 成功 的字串。

而失敗的話,則是利用 catch 的語法去承接失敗的資料。

實際執行以後的結果:

https://ithelp.ithome.com.tw/upload/images/20200525/20121770kNwoejgoLB.png

可以看到因為我們傳入的是 1,所以被判斷為 truthy,最後回傳成功。

那麼現在改成 0 的話呢

promiseFn(0)
    .then((res) => {
        console.log(res);
    })
    .catch((err) => {
        console.error(err);
    });

https://ithelp.ithome.com.tw/upload/images/20200525/20121770cKSg6wDApy.png

這樣子大家能夠了解這樣基礎的觀念了嗎?

https://ithelp.ithome.com.tw/upload/images/20200525/20121770SHQFu6Or15.png

以上就是關於Promise 狀態的基礎運行解說,如果沒有問題的話我們就可以繼續往下一篇文章進行嚕! 汪汪~


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言