iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0
Modern Web

JavaScript 基礎修練系列 第 16

[Day16] JavaScript - Promise 物件

  • 分享至 

  • xImage
  •  
  • 我們過去在寫 JavaScript 使用的同步延遲,通常都是用非同步的 setTimeout 加 callback 來實現,但若有太多複雜的callback,即容易造成callback hell (如下圖)。
  • 而從ES6開始新增的Promise 物件,就是用來解決同步與非同步的問題,讓我們的程式碼更為簡潔更易維護。
                      https://ithelp.ithome.com.tw/upload/images/20210916/20141293JBVWtDFgnT.jpg
                    圖片來源: callback hell

Promise即是「承諾」之意,而產生的結果只有兩種,不是「成功」就是「失敗」,在程式裡的表示方式是"resolve"(成功) or "reject"(失敗),以下為基本語法:

let p = new Promise(function(resolve, reject) {
  if (true) {       
      resolve('success');  // 成功
   } else {
      reject('failed');    // 失敗
   }
});

需要先new一個Project物件,物件中包含兩個參數: resolve及reject。
resolve會在函式成功或為True的狀況下執行,reject 則是在失敗或為false的時候執行,resolve 和 reject 都有一個回傳值,可將這個會傳值透過.then傳給下一個流程。

result = true;
let p = new Promise(function(resolve, reject) {
  if (result) {       
      resolve('success');  
   } else {
      reject("failed");    
   }
});

p.then((message) => {
    console.log('This is the then ' + message)
}).catch((message) =>{
    console.log('This is the catch ' + d)


// This is the then success

下面這段也可以這樣排列,可讀性較高:

p
.then((message) => {
    console.log('This is the then ' + message)
})
.catch((message) =>{
    console.log('This is the catch ' + d)
})

Project這個物件提供了兩個方法(method): then()、catch(),如果想在Promise完成後執行後續的動作,我們可以這樣定義 p.then()p.catch():

  • p.then的意思是,當這個Promise裡的程式執行完之後,且結果是resolve時,就會跳到then這裡執行then裡的程式。

  • p.catch的意思是,當這個Promise裡的程式執行完之後,且結果是reject時,就會跳到catch這裡執行catch裡的程式。

  • 獲取回傳值

    • 要在then()裡獲取resolve的返回值,我們需在then裡的回調函數添加一個參數(這裡用message),當resolve函數被調用的時候,小括號裡的值就會返回到then()裡。
    • 要在catch()裡獲取reject的返回值,需在catch裡的回調函數添加一個參數(這裡用message),當reject函數被調用的時候,小括號裡的值就會返回到catch()裡,而一般reject返回的值都是錯誤訊息。

    這些返回值會顯現在回調函數裡的參數,這樣回調函數裡的程式碼就能使用這些返回值做進一步的處理。




參考資料:
https://www.oxxostudio.tw/articles/201706/javascript-promise-settimeout.html


上一篇
[Day15] JavaScript - 同步(Synchronous) 與 非同步 (Asynchronous)
下一篇
[Day17] JavaScript - Async & Await
系列文
JavaScript 基礎修練30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言