整理一些 Promise 相關的觀念與問題。文內節錄自 promise 問題集
重點整理
- 瀏覽器的 window 有一個 Promise,可以直接使用
.resolve.reject.race.all。 - 一般建立 Promise 需要用
new並且需要指定resolve否則會報錯。 Promise.then只有在resolve被執行後才會執行(.catch同理)。.finally有resolve或reject執行後會跟著執行,換句話說沒有執行resolve或reject,finally也不會執行。.then和.catch都會返回一個新的 Promise。所以.then或.catch返回的值不能是 Promise 本身,否則會造成死循環。.then可以傳入兩個function,第二個function可以視為是.catch的簡寫。但如果傳入非function會發生透傳。(question3-5).finally不接受任何的參數,也就是在.finally中是無法知道P romise 最終的狀態是 resolved 還是 rejected。
基礎題型
1 | const promise1 = new Promise((resolve, reject) => { |
1 | const promise = new Promise((resolve, reject) => { |
1 | const promise = new Promise((resolve, reject) => { |
1 | const promise1 = new Promise((resolve, reject) => { |
hint:
- Promise.then 會回傳一個 promise
- promise.then 其實可以有兩個參數
- 兩個都是 function 分別對應 promise 的 resolve 與 reject
1 | const fn = () => (new Promise((resolve, reject) => { |
Promise with setTimeout
1 | console.log('start') |
1 | const promise = new Promise((resolve, reject) => { |
hint:
promise.then((res) => {})(用new Promise建構的) 與Promise.resolve().then(() => {})要分清楚- 沒有執行
resolve之前,then不會被執行
1 | Promise.resolve().then(() => { |
1 | const promise1 = new Promise((resolve, reject) => { |
Promise 的 then, catch, finally
1 | const promise = new Promise((resolve, reject) => { |
1 | const promise = new Promise((resolve, reject) => { |
1 | const promise = new Promise((resolve, reject) => { |
1 | Promise.resolve().then(() => { |
1 | Promise.resolve(1) |
ANSWER
answer1-1
‘promise1’
‘1’ Promise{<pending>}
answer1-2
1 2 4 3
answer1-3
1 2 4
answer1-4
‘promise1’
‘1’ Promise{<resolved>: ‘resolve1’}
‘2’ Promise{<pending>}
‘resolve1’
answer1-5
1
‘start’
‘success’
answer2-1
‘start’
‘end’
‘resolve’
‘time’
answer2-2
1
2
4
‘timerStart’
‘timerEnd’
‘success’
answer2-3
‘start’
‘promise1’
‘timer1’
‘promise2’
‘timer2’
answer2-4
‘promise1裡的內容’
‘promise1’ Promise{}
‘promise2’ Promise{}
‘timer1’
Uncaught (in promise) Error: error!!!
‘timer2’
‘promise1’ Promise{: “success”}
‘promise2’ Promise{: Error: error!!!}
answer3-1
‘then: success1’
因為resolve只會執行一次,已經改變該 Promise 的結果後就不會再改變
answer3-2
‘catch: ‘ ‘error’
‘then3: ‘ undefined
先執行reject所以會從.catch開始執行
且catch會返回另一個 Promise 但沒有執行resolve所以只會印出undefined
answer3-3
‘timer’
success 1001
success 1002
Promise 內的resolve只會執行一次,但是.then可以調用多次
每次都會得到resolve時的值。
question3-4
“then: “ “Error: error!!!”
只要是 Promise 建構式內 return 非 Promise 的值都會被包裝成Promise.resolve()
如果要拋出錯誤可用throw或Promise.reject()
question3-5
1
.then傳入非function所以透傳。由第一個resolve傳入的值傳到最後。