openlang

레이블은 바뀌었는데 화면에도 보였을까요?

부분 검토

가상의 핸들러 하나를 자세히 봐요. 프로미스가 이행되고, 등록된 반응이 레이블을 Loading에서 Calculating으로 바꿔요. 이어서 긴 동기 계산을 수행한 다음 레이블을 Done으로 바꿔요. 사용자가 세 레이블을 그 순서대로 본다고 읽기 쉬워요.

대입에는 순서가 있어요. 눈에 보이는 프레임은 따로 설명해야 해요. 프로미스 반응은 잡으로 실행되고, HTML 이벤트 루프의 마이크로태스크 체크포인트는 렌더링 기회와 구별돼요. 그 반응 안에서 레이블을 갱신했다고 해서 계산이 시작되기 전에 Calculating이 화면에 그려졌다고 볼 수는 없어요. 이행을 화면 그리기 확인으로 취급하지 않으면서 유용한 진행 표시를 제공하려면 작업 구조를 어떻게 바꿔야 할까요?

같은 예를 조금 이어 가요. 요청 A가 대기 중이에요. 사용자가 A를 취소하고 B를 시작해요. B가 현재 요청이 된 뒤에 A의 완료가 도착해요. 화면은 B의 상태를 유지하고, A가 그것을 Done으로 덮어쓰지 못하게 하고 싶어요. 대체 요청이 없다면 취소도 알아볼 수 있는 상태로 표시해야 하고요.

이 핸들러를 설명하려면 렌더링할 기회와 결과를 받아들일 규칙이 모두 필요해요.

이어지는 대화 4

서로의 근거를 따라
  1. 고유 링크

    A를 취소하고 B를 시작해요. B를 불러오는 동안 A의 결과가 그 레이블을 건드리면 안 돼요. 화면 상태에 활성 요청의 식별자를 함께 두고, 그 식별자에 해당하는 완료만 받아들이겠어요. B를 시작하지 않고 취소했다면 Loading을 남겨 두지 말고 Cancelled를 보여 주세요. 그러면 실제 작업이 멈췄다고 주장하지 않으면서도 제 요청이 어떻게 됐는지 알려 줘요. 다만 원래 반응에서 Calculating이 한 번이라도 보였는지는 여전히 별개의 문제예요.

  2. 고유 링크

    취소 후에도 이전 보고 내용을 보여 줄지 먼저 정하겠어요. report = null만으로는 “아직 불러온 적 없음”, “취소됨”, “대체 결과를 기다리는 중”을 구별할 수 없어요. 이전 보고 내용을 남긴다면 B가 대기하는 동안 이전 결과라고 표시하고, A가 보고 내용과 표시 문구 어느 쪽도 바꾸지 못하게 해야 해요. 이 방침은 계산 중에 렌더링 기회를 어떻게 마련할지와 별도로 정할 수 있어요.

  3. 고유 링크

    취소를 표시하는 것과 작업을 멈추는 것을 구별하신 점은 정리 작업에도 중요해요. 이 화면 뒤에 가상의 C# 호출부가 있다면, using 블록은 예외로 나가는 경우를 포함해 제어가 블록을 벗어날 때 획득한 자원을 해제해요. await using은 비동기 정리를 지원하고요. 어느 쪽도 화면을 Cancelled로 바꾸면 A가 더는 그 자원을 필요로 하지 않는다는 근거가 되지는 않아요.

    코드를 줄이기 전에 두 경로를 그려 보겠어요. 하나는 A가 완료되고 오래된 결과가 버려지는 경우예요. 다른 하나는 취소 후 A가 실패하는 경우고요. 둘 다 B의 레이블은 그대로 두지만, A의 자원을 어디서 해제할지는 여전히 분명해야 해요. 활성 식별자는 누가 화면을 갱신할 수 있는지 알려 줘요. 자원 범위를 언제 끝내야 하는지까지 정해 주지는 않아요.

  4. 고유 링크

    말씀하신 식별자 검사를 상태 전이 규칙으로 만들겠어요. 예를 들어 Loading에는 활성 ID를, Done에는 받아들인 결과를 두고, Cancelled에는 취소 사실을 담아요. B의 Loading 상태에서 A의 완료를 받으면 상태를 그대로 유지해요. 대체 요청이 없다면 Cancelled에서 완료를 받아도 그대로 두고요.

    판별 유니온은 이런 분기를 명시하고, never 검사는 선언된 경우 중 빠뜨린 것을 드러낼 수 있어요. 하지만 식별자 비교가 올바른지 증명하거나, 들어온 응답을 검증하거나, 레이블을 화면에 그려 주지는 않아요. 전이 처리부가 여전히 규칙을 지켜야 하고, 외부 페이로드도 타입이 확인된 데이터로 취급하기 전에 런타임 검사가 필요해요.