+setTimeout(_ => { - console.log(4) +}) +new Promise(resolve => { + resolve() + console.log(1) +}).then(_ => { - console.log(3) +}) +console.log(2)
setTimeout(_ => console.log(4)) new Promise(resolve => { resolve() console.log(1) }).then(_ => { console.log(3) Promise.resolve().then(_ => { console.log('before timeout') }).then(_ => { Promise.resolve().then(_ => { console.log('also before timeout') }) }) }) console.log(2)
setTimeout 做爲宏任務來存在 而 Promise.then 則是 微任務 上述代碼按序號輸出 全部會進入的異步都是指的事件回調中的那部分代碼 在同步代碼執行完成後纔回去檢查是否有異步任務完成,並執行對應的回調,而微任務又會在宏任務以前執行 繼續在Promise 中實例化Promise 其輸出依然會早於 setTimeout 的宏任務 Event - Loop 是個啥? JavaScript是一個單線程的語言,贊成時間不能處理多個任務 就像咱們去銀行辦理業務的時候 每辦理完一個業務,櫃員就會問當前的用戶,是否還有其餘須要辦理的業務(檢查還有沒有微任務須要處理) 而客戶明確告訴說沒有事情之後,櫃員就會查看後邊還有沒有等着辦業務的人(結束本次宏任務,檢查還有沒有宏任務須要處理) 若是客戶說還有要辦理的業務(微任務) 就得接着辦理,直到辦理完成 (在當前的微任務沒有執行完成時,是不會執行下一個宏任務的)