在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ js Promise 和 setTimeout 的順序

js Promise 和 setTimeout 的順序

new Promise((resolve, reject) => {
  resolve()
}).then(() => {
  console.log(1)
  new Promise((resolve, reject) => {
    resolve()
  }).then(() => {
    console.log(2)
  })
  setTimeout(() => { console.log(3) }, 0)
})

console.log(4)

setTimeout(() => { console.log(5) }, 0)

// 4
// 1
// 2
// 5
// 3

為什么2比5先打?。康谝淮?macrotask queue 執(zhí)行完后將 microtask queue 中的 Promise.then 中的函數(shù)推出執(zhí)行,執(zhí)行結(jié)束后不是應(yīng)該調(diào)用 macrotask queue 中的 setTimeout 么?為什么 .then 中的 Promise 先執(zhí)行了。

回答
編輯回答
蔚藍(lán)色

microtask queue里有兩個(gè) Promise 回調(diào),都跑完了才能走下一個(gè)macrotask queue

2018年4月11日 05:15
編輯回答
敢試

檢查microtask queue,有promise回調(diào)要處理,出隊(duì)并執(zhí)行p1回調(diào),執(zhí)行回調(diào)的過程中往microtask queue添加promise,這是第一輪檢查。繼續(xù)檢查microtask queue,發(fā)現(xiàn)p2回調(diào),出隊(duì)執(zhí)行,第二輪結(jié)束。
檢查macrotask queue

2017年3月30日 14:08
編輯回答
命多硬
new Promise((resolve, reject) => {
  setTimeout(()=>{resolve()},100);
}).then(() => {
  console.log(1)
  new Promise((resolve, reject) => {
    resolve()
  }).then(() => {
    console.log(2)
  })
  setTimeout(() => { console.log(3) }, 0)
})

console.log(4)

setTimeout(() => { console.log(5) }, 0)

你這樣寫5肯定會(huì)在2前面。你現(xiàn)在的代碼寫法 基本相當(dāng)于同步了,從上到下執(zhí)行,只有setTimeout是根據(jù)加入隊(duì)列的順序再執(zhí)行的。 是說相當(dāng)于哈,先打印出來是因?yàn)閠hen的優(yōu)先級高于setTimeout

2017年3月10日 08:37