Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рассинхронизация AJAX запросов 
:(
    Опции темы
DimaSiK
Дата 26.3.2010, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



Столкнулся с проблемой рассинхронизации AJAX запросов. То есть я допустим в секунду отсылаю 5 AJAX запросов но в некоторых случаях запрос посланный первым возвращает результат после выполнения все остальных, таким образом  затирая данные на клиентской стороне. Вариант с блокировкой экрана или отдельных элементов страницы не подходит - не юзерфрендли. Я хочу как-то закрутить все на стеке, но не совсем знаю как это реализовать. Может есть конечно другое более элегантное решение, подскажите пожалуйста? 


--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
IDVsbruck
Дата 26.3.2010, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: 8
Всего: 22



Делать пул (очередь) запросов - или самому, или просто взять фреймворк. К примеру, jQuery использует таковой для отправки.
Хотя опять-таки, имеет значение, что делает, для чего и как можно все это оптимизировать (слишком много запросов - это не есть очень хорошо). Объясню на примере какой-то игрушки, требующей часто выполнять какие-то действия и отправлять на сервер. Если действия имеют равный приоритет, то до поступления события с более высоким (допустим, смена страницы/комнаты/обстановки) приоритетом единственное, что от них требуется - выполнение пошагово друг за другом и чтобы результат от них поступал в порядке отсылки. Простым и логичным выходит, что надо просто друг за другом отсылать такие сообщения и ждать ответы. Однако а) это может быть долгим и б) можем столкнуться с такой ситуацией, когда время отсылки/приема - обработки, превысит поступающие новые сообщения и в определенный момент не сможем обработать все. Поэтому наиболее удобным со всех сторон вариантом является такой, когда во время ожидания ответа сервера мы накапливаем события и при следующем запросе отсылаем накопившиеся пачкой. Так получается, что работа сервера несопоставимо быстрее, чем процесс отправки/получения, поэтому экономия как времени, так и ресурсов очевидна. Естественно, сложность в реализации. Однако с определенным опытом это несложно. Главное, чтобы это соответствовало поставленной задаче.
Кстати, по такому же принципу работает keep-alive протокол, обменивающийся чанками (chunk, протокол chunked) - без стороннего вмешательства сам накапливает чанки и скидывает/получает пакетно.
PM MAIL   Вверх
DimaSiK
Дата 26.3.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



Решается следующая задача. Есть  интернет магазин и естественно есть корзина покупателя,  есть изделия которые продаются и у каждого изделия есть кнопка "+" и кнопка "-" - количество изделия. Так вот, если быстро попытаться нажать на "+" то в этом случае происходит рассинхронизация запросов. Если нажимать на кнопку хотя ты задержкой в 1 секунду все работает идеально. Я хочу решить эту проблему введя стек запросов, но правда не до конца знаю как это реализовать, а именно затруднение возникает в том, как узнать, что пользователь перестал нажимать на кнопку?  Вы написали: К примеру, jQuery использует таковой для отправки. - можете пояснить?   


--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
IDVsbruck
Дата 26.3.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: 8
Всего: 22



Я говорю, что jQuery использует пул для отправки сообщений на сервер.
А зачем при каждом нажатии на "+" и "-" делать запрос? - Проверка наличия? Думаю, тут решается все гораздо банальней - на время, пока не прийдет ответ, события с кнопок не отрабатываются. А то ж при плохой связи с сервером приложение захлебнется в событиях ...
PM MAIL   Вверх
DimaSiK
Дата 26.3.2010, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



Цитата(IDVsbruck @ 26.3.2010,  16:17)
Я говорю, что jQuery использует пул для отправки сообщений на сервер.
А зачем при каждом нажатии на "+" и "-" делать запрос? - Проверка наличия? Думаю, тут решается все гораздо банальней - на время, пока не прийдет ответ, события с кнопок не отрабатываются. А то ж при плохой связи с сервером приложение захлебнется в событиях ...

Такое решение рассматривалось, но не было принято заказчиком поэтому ищу иное.


--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
ksnk
Дата 26.3.2010, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Можно такую схему навернуть:
-- отсылать запрос не по нажатию кнопки, а после таймаута 0.3 сек. Если юзер за это время успеет еще несколько раз кликнуть по кнопкам - все клики учитываются и посылаются после последнего клика.
-- каждый запрос независим. При клике на кнопку результат запоминается в массиве "команд серверу". при передаче на сервер - все команды упаковываются в массив и передаются скопом.
-- ответ сервера - массив "команд клиенту", каждая команда отрабатывается клиентом независимо от вызвавшего команду запроса. Нужно избегать связок "запрос -- результат".

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
DimaSiK
Дата 26.3.2010, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



Логику работы я прекрасно понимаю. Затруднение возникает в реализации, а именно в том, как понять, что пользователь закончил кликать на кнопку и что требуется установка таймера ожидания, после которого отошлется единый запрос на сервер.


--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
ksnk
Дата 26.3.2010, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



после каждого действия пользователя, в результате которого нужно опросить сервер, ставится таймаут. Точнее 2, на пару секунд и 0.3 секунды. Время среднепотолочное, но мне пока нравится ;) Понятно, неплохо бы понимать, для чего вся эта механика наводится. Для чатовых приложений, времена вроде подходят.

после каждого нового клика переустанавливается второй (быстрый) таймаут. Как только он тикнет - можно посылать суммарных запрос. если тикнул первый (большой) таймаут, комплект запросов посылается на сервер, и все повторяется по новой.




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
DimaSiK
Дата 26.3.2010, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



Теперь все понятно, попробую реализовать.


--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
mxt
Дата 26.3.2010, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 6.9.2007

Репутация: нет
Всего: 1



есть вариант сделать как google со своим auto complete в графе поиска)  через тег SCRIPT
--------------------
PM MAIL   Вверх
brother79
Дата 30.3.2010, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 471
Регистрация: 18.8.2009

Репутация: 1
Всего: 6



А не проще ли тупо завести счётчик в переменной и после каждого запроса его увеличивать, а при получении ответа - его возвращать вместе с данными, и на клиентской части просто проверишь, последний полученный имел id больше - значит, наш запрос устаревший.


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0760 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.