本文開始
本文是跟著這一篇文章的教學內容所寫下的紀錄。
假設你是一個歌手,你的 fans 沒日沒夜的跟你要你將要發行的新歌。
接著,你給這些 fans 一個表單,讓他們填入他們的 email address,一旦新歌發布了,所有在 list 紹的 email address 的人都會收到通知,即使在作曲的過程中發生一些非常不順利的結果,例如:工作室失火,這些訂閱你的 fans 們,也一樣會收到通知。
這樣子的操作,讓你不再被 fans 煩,而這些 fans 也能即時的收到新歌分布的消息。
我們可以將以上這種狀況類推到 JS 的 Promise
的運作機制
Promise 是 JS 的一種特別的物件。
它可以用來連結 索取資源部分的程式碼 和 在取得資源後,在利用這個資源做其他事的程式碼 這兩部分的功能。
以下程式碼是用來建構 Promise
物件的寫法
1 | let promise = new Promise(function(resolve, reject) { |
傳入 new Promise 的函式叫做 executor。
當 new Promise 被執行後,executor 內部的內容就會被執行。
executor function 執行結果
這個 executor function 有兩個參數,分別為 resolve
和 reject
。
以上這兩個參數皆為 callback function 並且為 JS 的內建函式。
當 executor function 有執行結果時,會依照不同結果而去呼叫不一樣的 callback function
.呼叫 resolve(value)
- 如果 executor function 執行成功並夾帶著執行結果 value
.呼叫 reject(error)
- 如果 executor function 執行失敗並夾帶著 error
物件
簡單來說, executor function 執行成功呼叫 resolve
,若執行失敗呼叫 reject
。
Promise 物件的成員屬性
以下是 Promise
物件含有的成員屬性
state
: 初始值為 pending,若 resolve
被呼叫則會變成 fulfilled,若 reject
被呼叫則會變成 rejected 。
result
: 初始值為 undefined
,若 resolve(value)
被呼叫則會變成 value(也就是回傳的結果),若 reject(error)
被呼叫則會變成 error 。
下圖即為上述成員屬性,因呼叫不同的 callback function 而改變的流程
這邊舉個小範例
1 | new Promise(function(resolve, reject) { |
上面的範例, new Promise
是一個表達式所以它會直接執行該 Promise 物件裡面的內容,可以看到以上的範例中定義的 executor function 利用 setTimeout
function 在 2 秒後才呼叫 resolve
function,並夾帶 value
success。
所以,上面範例的 Promise 物件的成員屬性改變的過程如下
那我們改寫一下上面的範例,改成呼叫 reject 並回傳 error 物件
1 | new Promise(function(resolve, reject) { |
上面範例的 Promise 物件的成員屬性改變的過程如下
Note:
稍微提一下,reject 回傳的結果不一定一定要是 Error 物件喔,你也可以單純傳數字或者字串等等的內容,以上面的範例改寫的話,會長這樣
reject(‘fail’) ,如此一來就只會回傳字串內容 ‘fail’
❗executor function 只會執行一個 resolve
或 reject
如果今天我們在 executor function 裡面放入多個 resolve 或者 reject 會發生什麼事呢?
1 | new Promise(function(resolve, reject){ |
以上的範例只有第一個 resolve 會被執行到優,後面的都會被忽略。
另外, resolve
和 reject
都只接受一個參數而已,如果,你再多加其他的參數進去 resolve
或 reject
裡,是不會被理會的。
❗可以立即呼叫 resolve
或 reject
通常專案中我們會利用 Promise 去執行非同步的任務 (e.g. 跟 server 索取資料 …),這個非同步任務通常會經過一段時間後,才呼叫 resolve
或 reject
。
但我們其實也可以立即呼叫 resolve
或 reject
,像下面範例這樣。
1 | new Promise(function(resolve, reject) => { |
上面的範例,就會立即呼叫 resolve function 喔。
❗ state
或 result
是內建的 Promise 成員屬性
state
或 result
是內建的 Promise 成員屬性,我們無法直接調用這兩個成員屬性值,
但 Promise 物件還是有開放像是 then
, catch
, finally
這三個成員函式讓我們使用。
Conclusion
以上的內容,先記錄了
. Promise
物件可以怎麼被創建
. Promise
物件的 executor function 可以寫入什麼內容,以及它的參數 resolve
和 reject
這兩個 callback function。
. Promise
物件的成員屬性 state
和 result
會在呼叫 resolve
或 reject
之後,被修改成相對應的改變。