JavaScript 中 Promise 高階面試題求問
发布于 3 年前 作者 BoisonChang 9280 次浏览 最后一次编辑是 3 年前 来自 问答
粉丝福利 : 关注VUE中文社区公众号,回复视频领取粉丝福利

問題:

new Promise((resolve) => {
    console.log(1)
    resolve()
}).then(async () => {
    console.log(2)
}).then(async () => {
    console.log(3)
})
new Promise((resolve) => {
    console.log('a')
    resolve()
}).then(() => {
    console.log('b')
}).then(() => {
    console.log('c')
}).then(() => {
    console.log('d')
}).then(() => {
    console.log('e')
})

正解:

1 a 2 b c d 3 e

求問思路,我自己的答案應該是 1 a 2 b 3 c d e,就是 then 之後的我覺得都會放入 microtask

爬了很多篇文作了以下筆記,但還是不知道這題為何這樣?

  • 已知的是 async 如果沒有接 await 還是會回傳 Promise 物件
  • .then 中沒有回傳值的話,還是會回傳 Promise 物件 return new Promise.resolve()
  • .then 後的內容會被放入 microtask
  • 會先在 task 處理完同步的,再以先進先出的方式將 microtask 任務取出執行
  • Promise 的狀態只能改一次改成 resolved 或者 rejected,前者可執行 then 後者 catch
  • Promise 在 resolve/reject 前的內容是同步的
  • 本題貌似沒有出現會被放入 macrotask 的
回到顶部