2010-09-19 3 views
2

В настоящее время я использую jQuery для выполнения запроса ajax на каждом нажатии клавиши. Поэтому, если мой пользователь набрал d-o-n-k-e-y, он отправил бы один запрос для каждой буквы. Однако, поскольку они берут разные пути к серверу в сети, если они слишком быстро набирают d-o-n-k-e-y, они не всегда поступают по порядку. Они могут поступать как D-n-o-k-y-e и реагировать соответственно. Есть ли хороший способ убедиться, что все запросы отправлены по порядку?Есть ли способ, которым я могу сделать запросы ajax всегда в порядке?

Я не думаю, что ожидаю подтверждения от запроса перед отправкой следующего, потому что это замедлит передачу информации. У кого-нибудь есть идеи?

Спасибо.

ответ

7

От: http://api.jquery.com/jQuery.ajax/

асинхронной булевой
По умолчанию: правда

По умолчанию все запросы посылаются асинхронно (т.е. это устанавливается в истинном по умолчанию). Если вам нужны синхронные запросы , установите для этого параметра значение false. Запросы на перекрестные домены и данныеТип: Запросы «jsonp» не поддерживают синхронной работы. Обратите внимание: синхронные запросы могут временно блокировать браузер, отключая любые действия во время запроса запроса.

Кроме того, может быть не самая лучшая идея отправить запрос ajax на каждое нажатие одной клавиши. Не можете ли вы использовать тайм-аут и отправить запрос don и key (буферизованный до каждых 300 мс, например)?

+0

Это потрясающая идея. Благодаря! – Ethan

+0

+1 для предложения буферизации и задержки. –

-1

Вот некоторые ideas-

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

  • Вместо того, чтобы ваш сервер отслеживал, какие запросы пришли, когда требуется только небольшой вспомогательный объект для отслеживания последнего запроса. var mostRecentRequest = XHR ({success: function() {if (this === mostRecentRequest) {...}}});

  • Как упоминалось выше, позвоните только на сервер, когда пользователь перестанет набирать текст. Сделайте setTimeout() на клавиатуре, которая срабатывает ~ 500 мс позже и отправляет запрос, и отменяет и перезагружает этот тайм-аут при каждом нажатии нового ключа.

НЕ выполняйте синхронные запросы XHR в браузере. Когда-либо. При любых обстоятельствах. Весь браузер будет висеть до тех пор, пока запрос не будет завершен, и это может занять пару секунд.

Смежные вопросы