iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0
Modern Web

用Node.js建立專屬於你的API吧系列 第 9

Day 9 - JavaScript進階概念(三)- Promise 異步編程

  • 分享至 

  • xImage
  •  

前情提要

JavaScript是一種同步的程式語言,一次只能執行一種動作,但有時可能遇到一些需要同時進行的步驟,因此就有了Promise的概念。

同步VS異步

這裡簡單說明一下同步和異步的差別,以下用一張圖來講解:
https://ithelp.ithome.com.tw/upload/images/20220902/20151565ftzonH9LOI.png

  • 同步:意思如圖所示,一切都是依照順序來,沒有任何步驟會同時進行,一定都是執行完一個再執行下一個。

  • 異步:和同步相反,可能同時會有步驟一起進行。

Promise講解

1.功用:用來處理非同步事件

2.Promise 第一部分(使用Promise)

const promise = new Promise((resolve, reject) => {
    if(...條件為真) {
        resolve(...);
    } else {
        reject(...);
    }});

Promise是一個建構函數,而裡面放的參數是一個方法,而在方法中又有兩個參數分別是resolve和reject(可以自己命名,但一般是以這兩個名字為主),resolve代表的是執行成功時reject代表的是執行失敗時。在裡面可以設定條件,這個條件為真執行成功時,resolve要填什麼值,都否執行失敗時,reject要填什麼值,而這些值會影響到接下來要講的。

3.Promise 第二部分(Promise執行成功或失敗後續)

promise.then(result => {...}); //不一定要命名為result,只是一般是這樣命名
promise.catch(error => {...}); //不一定要命名為error,只是一般是這樣命名
promise.finally(() => {...}); 

這三種都是Promise建立後可以使用的方法,以下為介紹:

  • then():
    當Promise執行成功時會跳到then這個方法裡,並且resolve裡面填的值會傳進result裡面,你可以在裡面進行當執行成功後要幹嘛。
  • catch():
    當Promise執行失敗時會跳到catch這個方法裡,並且reject裡面填的值會傳進error裡面,你可以在裡面進行當執行失敗後要幹嘛。
  • finally():
    一切執行完畢時會進入此方法裡,你可以在裡面表示此次異步流程已經結束(以讀取文件為例,finally()裡面可以有把文件關閉的流程,並回傳已經結束之類的)。

4.Promise 整體

const promise = new Promise((resolve, reject) => {
    if(...條件為真) {
        resolve(...);
    } else {
        reject(...);
    }}).then(result => {
    
    }).catch(error => {
    
    }).finally(() => {
    
    }});

還有一種寫法是把全部都寫在一起,個人覺得這樣比較好,因為不僅可以一目了然,而且如果往後有問題也可以更快找到。


上一篇
Day8 - JavaScript進階概念(二)- 匿名函數
下一篇
Day10 - JavaScript進階概念(四) - async/await
系列文
用Node.js建立專屬於你的API吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言