
20.01.2013, 14:31
|
Профессор
|
|
Регистрация: 15.08.2012
Сообщений: 285
|
|
Прервать событие Ajax или автозаполнение полей
Не знаю как сделать. При вводе каждого символа делаю проверку через Ajax, навроде автозаполнения полей. Если сделать запрос синхронным, то в том же ie8 подвисает все, пока ждет ответа, а если сделать запрос асинхронным, то в том же ie8 все запросы не успевают обновиться. А нужно, чтобы последний запрос обязательно обновился.
Как правильно сделать?
Последний раз редактировалось platedz, 20.01.2013 в 14:41.
|
|

20.01.2013, 14:58
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от platedz
|
Не знаю как сделать. При вводе каждого символа делаю проверку через Ajax, навроде автозаполнения полей. Если сделать запрос синхронным, то в том же ie8 подвисает все, пока ждет ответа, а если сделать запрос асинхронным, то в том же ie8 все запросы не успевают обновиться. А нужно, чтобы последний запрос обязательно обновился.
Как правильно сделать?
|
В ИЕ нужно контролировать кол-во незавершенных Аякс запросов(имхо одновременно не более 4)
|
|

20.01.2013, 17:00
|
Профессор
|
|
Регистрация: 15.08.2012
Сообщений: 285
|
|
А оборвать никак нельзя уже поставленные в очередь запросы или текущие?
|
|

20.01.2013, 17:15
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
platedz,
Создать массив вызова функций Aякс-запросов,(изначально пустой)
Каждому Aякс-запросу передавать его номер в массиве,
По исполнению запроса, ( в саllback) удалять запрос из массива,
Таймирующая функция смотрит массив и ежели менеее 4 дописывает очередной нужный - нет накапливает в собственом буферном массиве.
Т.е вместо обращения к Аякс - обращаетесь к таймируюшей функции.
|
|

20.01.2013, 19:05
|
Профессор
|
|
Регистрация: 15.08.2012
Сообщений: 285
|
|
Спасибо. Думаю, хороший Вариант, особенно если нужно, чтобы каждый запрос был обработан. Хотя для моей задачи, наверное лучше как-то насильно оборвать запрос. Я сделал запрос синхронным, т.к. при асинхронном запросе данные возвращаются неупорядоченно. У меня получается, что пользователь вручную вводит какое-либо слово. Т.е при клике идет проверка, какие символы он ввел, если набранное слово не содержит лишних символов, то переходим к ajax проверке, т.е. содержится ли оно в базе. Поэтому, хотелось бы сделать так, чтобы например после следующего клика, функция еще не выполнилась, то, учитывая, что от нее толку уже нет, оборвать ее выполнение и перейти к следующей. Это в целом относится не только к ajax, но и к выполнению всей функции в целом.
|
|

20.01.2013, 19:13
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
platedz,
Ну я знаю как оборвать корректно, это наверно нужен второй запрос на серв для обрыва соединения
Возможно есть какой abort (пробуйте погуглить
|
|

20.01.2013, 21:40
|
Профессор
|
|
Регистрация: 15.08.2012
Сообщений: 285
|
|
Второй запрос не нужен. Просто думалось, что если при синхронном запросе, раз они последовательно выходят, то значит если скажем,
1) первый запрос отправлен
2) отправляем второй запрос, первый еще не обработался, второй встает в очередь
3) отправляем третий запрос. первый еще не обработан, второй из очереди удаляем, ставим в очередь третий.
|
|

21.01.2013, 01:30
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от platedz
|
1) первый запрос отправлен
2) отправляем второй запрос, первый еще не обработался, второй встает в очередь
3) отправляем третий запрос. первый еще не обработан, второй из очереди удаляем, ставим в очередь третий.
|
Сообщение от platedz
|
Просто думалось, что если при синхронном запросе, раз они последовательно выходят, то значит если скажем,
|
Не выйдет так. на то он и синхронный, что между запросом и ответом никакие действия не производятся вообще-всё блокируется
|
|

25.01.2013, 22:13
|
Профессор
|
|
Регистрация: 15.08.2012
Сообщений: 285
|
|
В целом сделал, спасибо Deff за идею. Строку запроса добавляю в глобальную переменную, и остальные запросы отправляю уже рекурсивно, пока существует переменная. Все работает, но в консоли получаю
Uncaught TypeError: Object #<XMLHttpRequest> has no method 'method'
method.ro.onreadystatechange
Как бы понять в чем ошибка?
|
|

26.01.2013, 00:43
|
Профессор
|
|
Регистрация: 15.08.2012
Сообщений: 285
|
|
Причину выявил при рекурсии у меня был примерно такой код
var func = function(){
return {
method: function(){this.method();}
}
}()
переделал на
var func = function(){
return {
method: function(){func.method();}
}
}()
Я насколько помню this вроде ищется от внутреннего this до window по типу наследования. Или как оно на самом деле?
|
|
|
|