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

Это интересная проблема.

Я делаю асинхронный ajax put

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

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

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

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

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

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

UPDATE

в качестве теста я переключился на использование POST вместо PUT: скорректированный тип: "POST" на стороне JS и [HttpPost] на веб-api (серверная сторона).

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

ОБНОВЛЕНИЕ

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

+5
03 дек. '13 в 0:16
источник поделиться
2 ответа

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

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

+1
03 дек. '13 в 0:21
источник

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

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

0
03 дек. '13 в 5:03
источник

Посмотрите другие вопросы по меткам или Задайте вопрос