---
# System prepended metadata

title: js三明治
tags: [補充]

---

# 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只需要一個完成就能往下執行