@gde_kefir

Как отменять связанные цепочки действий в асинхронном приложении?

Всем привет! В веб приложениях бывает необходимо создать функционал, который отображает действия, не дожидаясь ответа сервера. Это делается для ощущения "более шустрого и отзывчивого" приложения.
Например, представим что у нас есть "веб-морда" файлового менеджера. Мы нажали кнопку "создать папку", и сразу увидели, что у нас создалась папка. Хотя для ее реального создания отправляется запрос на сервер, и ответ с подтверждением что она реально создалась придет может вообще через секунд 20 (в случае каких-либо задержек сети, например). А может и вовсе придет ответ об ошибке, и тогда нашу отображаемую "фейковую" папку нужно будет у клиента скрыть, как будто ее и не было (можно конечно при этом отобразить уведомление что при создании папки возникла ошибка). Это все просто, если мы говорим об одном действии, и его отмене. А если речь идет о цепочке действий?

Пример:
1. Пользователь нажал кнопку "создать папку", и новая папка сразу отобразилась в веб-приложении. Назовем ее "папка-А".
2. Пользователь переместил в папку-А файл из папки-Б.
3. Пользователь совершил еще какие-то операции, не связанные с папкой-А. Например, переименовал какую-нибудь другую папку, создал где-то еще один файл, и т.п..
4. С сервера пришел ответ об ошибке, что папка-А не была создана.
5. Должны отмениться шаги 1-2. А действия, совершенные, в шаге 3 должны остаться в силе, так как они не касались этой ошибки.

Как бы вы реализовали данную логику? Может предложили бы какой-нибудь паттерн проектирования?

А если еще допустить что в пункте 3 была удалена папка-Б?
  • Вопрос задан
  • 402 просмотра
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Это все просто, если мы говорим об одном действии, и его отмене. А если речь идет о цепочке действий?
В том сценарии, что вы описали, просто не нужно использовать оптимистичный интерфейс.
Да это и невозможно - как переместить файл в папку не зная её id? На клиенте, это, положим, реализовать можно, но отправить запрос сохранения на сервер - уже нет.

В данном случае придётся скорость работы интерфейса приносить в жертву упрощению кода и здравому смыслу.
Идеальный вариант - показать папку сразу, но явно выделить её как "загружающуюся".
Возьмём, например, веб-интерфейс Я.Диска: там реализована именно такая логика. Очевидно, что у Яндекса есть возможность потратить деньги и силы на реализацию "очередей атомарных операций", но они решили, что оно того не стоит.

И часто такой интерфейс может отстрелить пользователю ногу. Вы услужливо дали ему наизменять структуру директорий, а потом оказалось, что нужно отматывать всё к самому началу. Как думаете, пользователь в этот момент подумает "Ну, по крайней мере интерфейс не тормозил, когда я всё это делал" или всё-таки что-то другое?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы