Как работать с внепоследовательными Ajax-запросами? - PullRequest
3 голосов
/ 04 декабря 2010

Как лучше всего обрабатывать непоследовательные запросы Ajax (предпочтительно с использованием jQuery)?

Например, запрос Ajax отправляется из браузера пользователя каждый раз, когда изменяется поле.Пользователь может изменить dog_name на «Пушистый», но мгновение спустя он меняет его на «Точечный».Первый запрос по какой-либо причине задерживается, поэтому он поступает на сервер после второго, и в итоге ее собаку называют «Пушистый» вместо «Точечный».

Я мог бы передать временную метку на стороне клиентавместе с каждым запросом, и пусть сервер отслеживает его как часть каждой записи Dog и игнорирует предыдущие запросы на изменение того же поля (но только если разница меньше 5 минут, если пользователь меняет время наее машина).

Является ли этот подход достаточно устойчивым, или есть лучший, более стандартизированный подход?

РЕДАКТИРОВАТЬ:

Мэтт сделал большойуказать в своем комментарии.Намного лучше сериализовать запросы, чтобы изменить одно и то же поле, так есть ли стандартный способ реализации очередей запросов Ajax?

EDIT # 2

В ответ на @ cherouvim'sкомментарий, я не думаю, что мне придется заблокировать форму.Поле изменяется, чтобы отразить изменение пользователя, запрос на изменение помещается в очередь.Если в очереди ожидает запрос на изменение того же поля, удалите этот старый запрос.2 вещи, которые мне еще нужно было бы рассмотреть:

  1. Размещение запроса в очереди является асинхронной задачей.Я мог бы иметь обработчик обратного вызова из предыдущего запроса Ajax отправить следующий запрос в очереди.Код Javascript не является многопоточным (или ... так ли это?)

  2. Если запрос не выполнен, мне потребуется пользовательский интерфейс, чтобы отобразить состояние последнего успешного запроса.Таким образом, если пользователь меняет имя собаки на «Spot» и запрос Ajax не выполняется, поле должно быть возвращено на «Fluffy» (последнее значение успешно зафиксировано).

Какие проблемы мне не хватает?

Ответы [ 2 ]

3 голосов
/ 04 декабря 2010

Прежде всего вам нужно сериализовать обработку на стороне сервера для каждого клиента.Если вы программируете на Java, то синхронизации выполнения на объекте сеанса http достаточно.Сериализация поможет в случае, если второе обновление произойдет во время обработки первого.

Второе улучшение, которое вы можете реализовать в обновлении вашей сущности, это http://en.wikipedia.org/wiki/Optimistic_concurrency_control. Вы добавляете свойство version (и столбец)для вашей сущности.Каждый раз, когда происходит обновление, оно увеличивается один раз.Фактически оператор update выглядит следующим образом:

update ... set version=6 ... where id=? and version=5;

Если затронутые строки из вышеприведенного запроса псевдопросмотра равны 0, тогда кому-то другому удалось сначала обновить сущность.То, что вы делаете, зависит от вас.Обратите внимание, что вам необходимо отобразить версию в форме обновления html объекта как скрытый параметр и отправлять ее обратно на сервер каждый раз, когда вы обновляете.По возвращении вы должны написать обратно обновленную версию.

Как правило, первого улучшения будет достаточно.Второй улучшит систему, если многие люди одновременно редактируют одни и те же объекты.Это решает проблему "потерянного обновления".

1 голос
/ 05 декабря 2010

Я бы реализовал очередь на стороне клиента с цепочкой успешных запросов или откатов на неудачных запросах.

Вам необходимо определить «неудачно», будь то тайм-аут или возвращаемое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...