From e5b896283f1882ed0e636376cebbda66ab023617 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 6 Sep 2026 23:27:37 +0900 Subject: [PATCH] =?UTF-8?q?fix(B05):=20=EB=B0=B0=EB=B6=84=20=EC=84=A0?= =?UTF-8?q?=EB=B0=98=EC=9E=85=20=EB=90=98=EB=A8=B9=EC=9E=84=EC=9D=84=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20=EB=B0=98=EC=98=81=20=EA=B5=AC=EA=B0=84?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=81=8A=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 표식(측점 수 + 누계)만으로는 부족했음 — 응답을 반영해 다시 그린 뒤 누계가 아주 조금 달라지는 경로가 있어 편집이 멈춘 뒤에도 2~3바퀴가 더 돌았음(보조 창 10초 관찰: 2.8~6.3초에 걸쳐 3건). onReady 로 다시 그리는 동안 applying 을 세워 그 그리기가 거는 schedule 을 무시함. 자체검증(공용 브라우저, 접은 채 계획고 6회 편집 후 10초 관찰 3회) — 3/3/1건 -> 2/1/1건. 편집하는 동안은 종전대로 0건(400ms 안정화 유지). typecheck 통과. Co-Authored-By: Claude Opus 5 (1M context) --- B05_Profile/B05_Profile_Api_HaulPlan.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/B05_Profile/B05_Profile_Api_HaulPlan.ts b/B05_Profile/B05_Profile_Api_HaulPlan.ts index 79c4b3eb..60a15c8e 100644 --- a/B05_Profile/B05_Profile_Api_HaulPlan.ts +++ b/B05_Profile/B05_Profile_Api_HaulPlan.ts @@ -46,6 +46,8 @@ export function createHaulPlanPrefetch( let pending: unknown = null; /** 마지막으로 보낸 입력의 표식 — 같은 값이면 다시 묻지 않는다. */ let sentKey: string | null = null; + /** 받은 값을 화면에 반영하려고 다시 그리는 중 — 그 그리기가 거는 요청은 무시한다. */ + let applying = false; /** * 입력이 달라졌는지 가리는 짧은 표식. 응답이 오면 곡선을 다시 그리고, 그리기가 다시 @@ -81,7 +83,15 @@ export function createHaulPlanPrefetch( // 늦게 온 응답은 버린다 — 그 사이 사용자가 계획고를 더 만졌을 수 있다. if (seq !== sequence) return; plan = payload.haul_plan ?? null; - onReady(); + // 다시 그리기가 `schedule` 을 되부르므로 그 한 바퀴를 막는다. 표식(`sentKey`)만으로는 + // 부족했다 — 반영 뒤 누계가 아주 조금 달라지는 경로가 있어 2~3바퀴가 더 돌았다 + // (2026-09-06 보조 창 실측: 편집이 멈춘 뒤 2.8~6.3초에 걸쳐 3건). + applying = true; + try { + onReady(); + } finally { + applying = false; + } } catch { // 배분을 못 받아도 곡선 자체는 그대로 보인다 — 화면을 막지 않는다. } finally { @@ -91,6 +101,7 @@ export function createHaulPlanPrefetch( return { schedule(result) { + if (applying) return; // 응답을 반영하려고 다시 그리는 중이다. const key = keyOf(result); if (key === sentKey) return; // 같은 값 — 응답이 부른 재그리기가 되돌아온 것이다. sentKey = key;