AJAX. Отображение готовности результата в процентах.

[Удален]
770

Есть проект по недвижимости.

Пользователь задаёт параметры поиска объекта недвижимости, все эти параметры скидываются через AJAX скрипту. И на месте вывода результата крутится колёсико. Поиск может занимать достаточно продолжительное время от 2 до 7 секунд.

Хотелось бы, чтобы вместо колёсика отображался процент готовности обработки запроса.

Как такое учудить, подскажите?

[umka]
На сайте с 25.05.2008
Offline
456
#1

Каким образом осуществляется поиск, что он так много времени занимает?

Лог в помощь!
Алексей Барыкин
На сайте с 04.02.2008
Offline
272
#2

Надо оптимизировать запросы и поиск, а не маяться дурью. :)

[umka]
На сайте с 25.05.2008
Offline
456
#3

Алексей Барыкин, не, ну всякое бывает )

Может у товарища скрипт опрашивает сотню баз разных агентств недвижимости.

Но с вами я тоже согласен )

[Удален]
#4
Каким образом осуществляется поиск, что он так много времени занимает?

Ну ищет предприниматель себе коровник, например. Вот и извращается. У коровника между прочим более 30 всяких параметров :), а таких предпринимателей куча и объектов почти 5000.

Когда параметров мало - быстренько, а когда много, там еще и расчёты всякие нужно вести. Сумма затрат на содержание, в зависимости от еще 5 параметров.

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

Надо оптимизировать запросы и поиск, а не маяться дурью.

Пока есть возможность только кэш использовать. Запросы, как могли оптимизировали. Теперь ждём, пока московские программисты базу в нормальный вид приведут. А ждём уже с 12 января

[umka]
На сайте с 25.05.2008
Offline
456
#5

Вы так и не ответили на мой вопрос.

Придется проявлять телепатические способности.

Если поиск осуществляется по одной базе данных, и объектов в ней всего 5000, то даже если поиск осуществляется по 30 критериями, он никак не должен занимать столько времени.

Если конечно по "расчетами" не подразумевается решение систем дифференциальных уравнений NN-го порядка :D

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

Далее по существу.

Если поиск осуществляется оним запросом, то вашу задачу вы не решите. (Вы сможете отображать или 0% или 100%)

Если поиск осуществляется двумя запросами, то вы можете отображать 0% или 50% или 100%

И т.д.

Ёхан Палыч
На сайте с 07.05.2006
Offline
169
#6

Если ну очень надо в процентах, то можно вместо колесика показывать анимированный gif длительностью 7 секунд: 5%-8.5%-12.65% -и т.д до 99%. После ответа показать gif 100%.

L
На сайте с 14.05.2009
Offline
30
#7

Ну, скорее уж просто сделать колесико, мол "запрос обрабатывается, подождите пожалуйста несколько секунд". А % пытаться приделать - не выйдет, т.к. Вы не знаете сколько конкретно времени необходимо на данный запрос.

[Удален]
#8

Теоретически с помощью одного xmlhttprequest-запроса это невозможно, так как он отдает только четыре состояния.

Запрос xmlhttp регулярно отчитывается о своем состоянии через вызов функции xmlhttp.onreadystatechange. Состояние под номером 4 означает конец выполнения, поэтому функция-обработчик при каждом вызове проверяет - не настало ли это состояние.

Вообще, список состояний readyState такой:

0 - Unitialized

1 - Loading

2 - Loaded

3 - Interactive

4 - Complete

Состояния 0-2 вообще не используются.

Вызов функции с состоянием Interactive в теории должен происходить каждый раз при получении очередной порции данных от сервера. Это могло бы быть удобным для обработки ответа по частям, но Internet Explorer не дает доступа к уже полученной части ответа.

Firefox дает такой доступ, но для обработки запроса по частям состояние Interactive все равно неудобно из-за сложностей обнаружения ошибок соединения. Поэтому Interactive тоже не используется.

После того, как javascript-функция запущена, можно просто вешать гифку и ждать, пока состояние станет 4.

Либо можно пойти более серьезным способом и все-таки сделать то, что вы хотите. Но здесь придется изобрести велосипед. При посылке запроса можно параллельно запустит другую функцию с setInterval, в котором запускать, например, каждые полсекунды другой аджакс-запрос. На сервере же сделать еще один файл, в который во время работы основного файла будет записываться количество процентов на данный момент (тоже каждые полсекунды, например), и, пока идет запрос, кушать много раз в сетИнтервале этот файл. Как только первая функция получает искомый ответ, просто выключаете интервал и убираете в display:none счетчик.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий