2013-12-03 5 views
5

Это интересная проблема.вызов jQuery.ajax последовательно приводит к одному обратному вызову

я делаю асинхронный Аякс поставил

return $.ajax({ 
     url: url, 
     type: 'PUT', 
     contentType: 'application/json; charset=utf-8', 
     async: true, // default 
     success: function (result, textStatus, xhr) {...} 

это работает, как ожидался, если пользователь не делает ставить перед предыдущими возвратами вызова (хотя это асинхронное, вызов действительно занимает .5 секунды, чтобы закончить)

, если пользователь нажимает на кнопку несколько раз (выполнение нескольких пут) происходит следующее:

  • я вижу только один вызов сервера в стельке
  • успех увольняет за каждый клик
  • всех обратных вызовов получить тот же самый новый идентификатор строки (возвращенный сервер)

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

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

ОБНОВЛЕНИЕ

в качестве теста я перешел на использование POST вместо PUT: отрегулировать тип: 'POST' на JS стороне, и [HttpPost] на веб-API (на стороне сервера).

Поведение не изменилось.

UPDATE

глядя на посты как this one .. это действительно должно работать. я не вижу какой-либо конкретной причины, по которой остальные параллельные запросы не выходят на сервер.

+2

Попробуйте «cache: false», возможно, что в игре есть кеширование, поэтому вы видите только один ответ с помощью скрипача. –

+0

Означает ли браузер, что он делает различные запросы? –

+0

браузер также видит только один сделанный. Я попытался установить кеш: false, но до сих пор не вижу различий в вышеприведенном поведении. –

ответ

1

Не должны ли запросы PUT быть идемпотентными? То есть, подавая несколько запросов, должен генерировать тот же ответ? Если это так, код может просто попытаться объединить ваши идентичные запросы PUT, так как они все должны иметь тот же результат. Если вы увеличиваете количество идентификаторов для каждого сообщения (т. Е. Меняете состояние сервера), вы должны использовать POST вместо PUT.

Это может не решить проблему; это просто мысль.

+0

HTTP/1.1 не определяет, как метод PUT влияет на состояние исходного сервера. Нет ничего о том, что PUT является идемпотентным, и на самом деле это обычно не так, я не знаю, почему это было поддержано. –

+0

@BenjaminGruenbaum см. Http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html раздел 9.1.2 –

+0

в моем случае, я использую put для создания новой записи. сервер возвращает идентификатор новой строки. это плохая практика использовать для этого? –

0

Вы не можете дождаться асинхронного обратного вызова в javascript. Вы должны перестроить свой код для выполнения всей будущей работы на основе асинхронного ответа от фактического обратного вызова.

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

+0

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

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