# js三明治 ###### tags:`補充` php是一門同步語言,一行一行執行 js是一門同步語言,具非同步特性,單執行緒,等主程式執行完,非同步才會執行, 單執行緒等主程式執行完,非同步才會執行,指的是執行先後順序不是同時進行 多執行緒非同步具有同時執行的能力 執行環境 slack堆疊:先進後出後進先出舉例:疊盤子 queue事件儲列:先進先出舉例:排列 放非同步函式的地方等主執行環境結束後才開始依序執行event queue裡的函式 setTimeout幾秒後執行 setInterval固定幾秒執行一次 document.getElementById.XMLHttpRequest Event Table記錄非同步目的達成後有哪些函式事件要被執行推送到event queue Event Loop事件迴圈:檢查主執行環境slack是否為空,如果是空的再去檢查event queue有沒有函式在等待執行,依序搬到主執行環境執行 ==Event Loop的執行順序微任务mi優先於宏任务ma== * 微任务队列micro task queue process.nextTick (Node独有) ==Promise(new promise 是同步代码)== Object.observe MutationObserver ==Promise.then catch finally== * 宏任务队列macro task queue ==setTimeout== ==setInterval== setImmediate (Node独有) requestAnimationFrame(浏览器独有) I/O UI rendering (浏览器独有) ==calkback function回呼函式==:確保某段邏輯在非同步行為完成後才被執行,==容易造成維護上的困難==巢狀結構 ==Promise==為了解決calkback function的缺點,我承諾幫你做某件事情,能不能成功還不一定,但我做完後會把結果告訴你 一個Promise會有3種狀態 - 擱置(pending):進行中,不是 fulfilled 與 rejected。 - 實現(fulfilled):表示操作成功,執行回呼函式resolve。 - 拒絕(rejected):表示操作失敗,執行回呼函式reject。 (settled):Promise已經被解決,結果已定 New 關鍵字:創造物件的方式 New Promise建構式:創造物件的方式(同步?) Promise(同步).then.then(非同步) 接收兩個參數async await非同步 Promise.then.catch接收一個參數try catch 如果一次有多個Promise(非同步)要同時一起使用可以使用Promise.all,Promise.race來接收 一個Promise物件組成的陣列 ==Promise.all==多個promise需要一起完成才能往下執行 ==Promise.race==多個promise只需要一個完成就能往下執行