在開發者工具透過 console.log(Promise)
,會得到一個 Promise 的函式,如下方結果,但因為裡面沒有內容,所以不會有任何結果。
1 | console.log(Promise) |
改用 console.dir(Promise)
,就可以看到 Promise 變成一個物件,並且有自己的方法,像是 reject
跟 resolve
,接收結果的 then
跟 catch
也在裡面。
1 | console.dir(Promise) |
實體化 promise
既然 Promise 是一個物件,那也可以將其實體化,並使用它,下方就是實體化的起手式。
1 | const a = new Promise(() => {}); |
透過開發者工具可以看到下方資訊:
1 | Promise {<pending>} |
- Promise 正在
pending
未確認狀態。 - 目前值的結果是
undefined
,在透過resolve
跟reject
回傳後就會得結果的值。
resolve
所以會帶入剛剛提到的兩個參數,resolve
跟 reject
,要注意的地方為一次只會執行一個,下方帶入 resolve
的方法,並且把要顯示的結果也寫入。
1 | const a = new Promise((resolve, reject) => { |
在看到開發人員工具,會看到 Promise 的狀態也改變了。
1 | Promise {<fulfilled>: "執行成功"} |
這時候知道是成功獲得資料,就可以使用 Promise 接收資料的方法來取得資料,所以可以用 then()。
1 | a.then((res) => { |
reject
那失敗當然就是執行 reject 的方法。
1 | const a = new Promise((resolve, reject) => { |
開發者工具就會得到:
1 | Promise {<rejected>: "執行失敗"} |
但是這地方會跳錯,因為之前還沒有寫上接收失敗結果的方法。
失敗就要使用 catch
來接收資料傳遞失敗的的結果,但不需要重新寫一個方法,而是直接在 then
的方法後面直接加上 catch
的方法即可。
1 | a.then((res) => { |
以上為 Promise 建立時的基本概念,實務上並不會這樣寫。
通常如果要建立一個 Promise 的實體,會使用函式,不管用具名或是匿名函式都可以,以下為基本 Promise 完成後的程式碼。
1 | function promiseFn(num) { |
- 建立函釋後直接
return
一個Promise
的實體物件,並且把之前寫的參數帶入。 - 既然是非同步事件,典型的用法為
setTimeout
。 - 在執行完非同步事件後,才會回傳結果。
執行上方函式,並給予真值,使用 then
取得正確的結果。
1 | promiseFn(1) |
如果帶入的參數為 0
,則會變失敗,就會由 catch
來呈現結果。
CodePen: https://codepen.io/hnzxewqw/pen/MWyRMGB?editors=1111