프로미스 마이크로태스크

Promise microtask

Promise 후속 작업은 현재 스택 뒤, 다음 타이머 작업 앞에서 실행됩니다.

···
html
<div class="v"><header><b>MICROTASK ORDER</b><span id="state"></span></header><main><div class="track" id="track"></div><div class="output" id="output"></div></main><footer>stack → microtask → task</footer></div>
css
.v{width:min(92vw,660px);height:min(86vh,310px);box-sizing:border-box;padding:clamp(9px,2.5vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);display:flex;flex-direction:column;gap:7px;color:var(--fg);font:500 clamp(15px,3.2vmin,17px)/1.25 var(--font-sans, sans-serif)}.v header,.v footer{display:flex;justify-content:space-between;align-items:center;gap:8px;white-space:nowrap}.v header b{color:var(--accent);font-size:.9em}.v header span,.v footer{color:var(--muted);font-size:.82em}.v main{flex:1;min-height:0;position:relative;overflow:hidden}.v .mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.v .active{background:var(--accent)!important;color:var(--bg)!important;border-color:var(--accent)!important}.v .muted{opacity:.28} .track{height:60%;display:flex;align-items:center;justify-content:space-around;gap:5px}.job{flex:1;text-align:center;padding:13px 2px;border:1px solid var(--line);border-radius:6px;font:600 .85em ui-monospace,monospace}.output{text-align:center;color:var(--accent);font:600 .9em ui-monospace,monospace}
js
const jobs=["sync","Promise","timer"];let n=0;function draw(){document.getElementById("track").innerHTML=jobs.map((x,i)=>"<div class=\"job "+(i===n?"active":i>n?"muted":"")+"\">"+x+"</div>").join("");document.getElementById("output").textContent="output: "+jobs.slice(0,n+1).join(" → ");document.getElementById("state").textContent=n===1?"microtask":n===2?"task":"stack";n=(n+1)%3}draw();setInterval(draw,900)

Promise의 then 콜백은 동기 코드가 끝난 뒤 마이크로태스크 큐에서 실행됩니다. 타이머 콜백은 별도 태스크로 들어가므로 같은 턴에서 예약되더라도 순서가 다릅니다.

마이크로태스크가 계속 새 마이크로태스크를 만들면 다음 태스크와 화면 갱신이 늦어질 수 있습니다. 데모는 세 작업을 같은 시점에 예약한 실행 순서를 보여줍니다.

언제 쓰나

비동기 출력 순서를 해석하거나 UI가 갱신되지 않는 원인을 찾을 때 씁니다.

페이지로 열기 ↗