비동기 취소

Async cancellation

더 이상 필요 없는 작업에 취소를 전달하고 자원을 정리합니다.

···
html
<div class="v"><header><b>CANCEL → CLEANUP</b><span id="state"></span></header><main><div class="steps" id="steps"></div><div class="notice" id="notice"></div></main><footer>signal, observe, clean up</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} .steps{height:62%;display:flex;align-items:center;justify-content:space-between;gap:3px}.steps b{flex:1;padding:12px 2px;border:1px solid var(--line);border-radius:6px;text-align:center;font:600 .82em ui-monospace,monospace}.notice{text-align:center;color:var(--accent);font:600 .85em ui-monospace,monospace}
js
let n=0;const labels=["running","signal","cleanup","stopped"];function draw(){document.getElementById("steps").innerHTML=labels.map((x,i)=>"<b class=\""+(i===n?"active":i>n?"muted":"")+"\">"+x+"</b>").join("");document.getElementById("notice").textContent=n===2?"release resources before exit":n===3?"no child left running":"parent controls lifetime";document.getElementById("state").textContent=labels[n];n=(n+1)%4}draw();setInterval(draw,950)

비동기 작업은 사용자가 화면을 떠나거나 상위 요청이 실패하면 더 이상 결과가 필요 없을 수 있습니다. 취소 신호를 전달하면 하위 작업이 중간에 멈출 기회를 얻습니다.

취소는 즉시 강제 종료가 아닐 수 있습니다. 작업은 안전한 지점에서 신호를 확인하고 파일, 잠금, 네트워크 자원을 정리한 뒤 종료해야 합니다.

언제 쓰나

사용자가 취소할 수 있는 요청이나 부모 생명주기에 종속된 작업에 씁니다.

페이지로 열기 ↗