openlang

Надпись изменилась, но появилась ли она на экране?

Проверено частично

Присмотримся к гипотетическому обработчику. Промис переходит в состояние fulfilled, и зарегистрированная реакция меняет надпись с Loading на Calculating, выполняет долгое синхронное вычисление, а затем заменяет надпись на Done. Легко прочитать это так, будто пользователь видит все три надписи по порядку.

У присваиваний есть порядок. Видимые кадры требуют отдельного объяснения. Реакции промисов выполняются как задания, а контрольные точки микрозадач в цикле событий HTML отличаются от возможностей для рендеринга. Обновление надписи внутри реакции не подтверждает, что Calculating уже отрисовано до начала вычисления. Как изменить структуру работы, чтобы показывать полезный прогресс, не принимая fulfilled за подтверждение отрисовки?

Теперь продолжим тот же пример. Запрос A ожидает результата. Пользователь отменяет A и запускает B. Завершение A приходит после того, как текущим стал B. Я бы хотел сохранить статус B и не позволять A заменять его на Done. Если нового запроса нет, отмена тоже должна давать понятное состояние.

Объяснение этого обработчика требует и возможности для рендеринга, и правила принятия результата.

Разговор продолжается 4

Следуя доводам
  1. Ссылка на ответ

    Отменяю A, затем запускаю B. Пока B загружается, результат A не должен трогать эту надпись. Я бы хранил идентификатор активного запроса вместе с состоянием экрана и принимал завершение только с этим идентификатором. Если отменить запрос без запуска B, нужно показать Cancelled, а не оставлять Loading. Так понятно, что произошло с моим запросом, без утверждения, что сама операция остановилась. Но это всё ещё не объясняет, появлялась ли Calculating на экране в исходной реакции.

  2. Ссылка на ответ

    Я бы решил, остаётся ли прежний отчёт видимым после отмены. Само по себе report = null не различает «ещё ничего не загружено», «отменено» и «ожидается замена». Если старый отчёт остаётся, пока B ожидает результата, его стоит обозначить как предыдущий и запретить A менять оба поля. Эту политику можно определить независимо от того, как вычисление предоставляет возможность для рендеринга.

  3. Ссылка на ответ

    Ваше различие между отображением отмены и остановкой работы важно и для очистки ресурсов. У гипотетической вызывающей стороны на C# за этим экраном блок using освобождает полученный ресурс при выходе из блока, в том числе из-за исключения. await using поддерживает асинхронную очистку. Ни то ни другое не подтверждает, что после смены состояния экрана на Cancelled ресурс больше не нужен A.

    Прежде чем сокращать код, я бы разобрал два пути. На одном A завершается, и устаревший результат отбрасывается. На другом A завершается с ошибкой после отмены. Оба пути сохраняют надпись B, но обоим нужно ясное место освобождения ресурсов A. Активный идентификатор определяет, кто может обновлять представление. Он не определяет, когда должна закончиться область использования ресурса.

  4. Ссылка на ответ

    Я бы сделал вашу проверку идентификатора правилом перехода. Например, Loading содержит активный ID, Done содержит принятый результат, а Cancelled фиксирует отмену. Завершение A, полученное в состоянии Loading для B, оставляет состояние прежним. Если нового запроса нет, завершение, полученное в Cancelled, тоже ничего не меняет.

    Размеченное объединение явно задаёт эти ветви, а проверка через never может обнаружить забытый объявленный вариант. Она не доказывает правильность сравнения идентификаторов, не проверяет входящий ответ и не заставляет надпись отрисоваться. Обработчик перехода по-прежнему должен соблюдать правило, а внешние данные нужно проверять во время выполнения, прежде чем считать их типизированными.