Я не уверен, что это на самом деле будет проблемой для вас, потому что Javascript является однопоточным. Когда приходит первый ответ ajax и вы выполняете некоторый javascript, этот javascript не может быть прерван вторым ответом ajax, если он представляет собой один непрерывный поток выполнения (без таймеров или других асинхронных вызовов ajax как часть его обработки).
Давайте пробежимся по сценарию:
- Пользователь нажимает кнопку - начинается первый вызов ajax.
- Пользователь нажимает кнопку - начинается второй вызов ajax.
- Первый ajax-вызов завершается, и начинается выполнение кода завершения для того, что делать с новыми данными.
- Пока код выполняется из первого вызова ajax, второй вызов ajax завершается. На этом этапе браузер помещает завершение второго вызова ajax в очередь. Он не может вызвать ни один из ваших кодов завершения, потому что движок Javascript все еще работает с первой загрузки.
- Теперь первая загрузка завершает выполнение и код и возвращается из обработчика завершения.
- Браузер переходит в свою очередь и находит следующее событие для обработки. Он находит завершение второго вызова ajax и затем запускает код завершения для этого вызова ajax.
Как вы можете видеть из этого сценария, в котором есть перекрывающиеся вызовы ajax, а второй завершается в середине обработки первого, конфликт по-прежнему отсутствует, поскольку механизм Javascript является однопоточным.
Теперь, как предлагали другие ответы, вы не хотите, чтобы этот пользователь запускал новый запрос, пока он еще обрабатывается, но технически они не конфликтуют друг с другом. У вас есть несколько инструментов, которые вы можете выбрать, если хотите предотвратить наложение вызовов:
- Вы можете запретить запуск второго вызова, пока первый вызов не завершен. Вы можете сделать это как в пользовательском интерфейсе, так и в реальном коде.
- Если имеется несколько ожидающих вызовов, вы можете решить отбросить / проигнорировать более ранние ответы и не обрабатывать их - ожидая только последнего ответа.
- Когда инициируется второй вызов, вы можете отменить первый вызов.
- Вы можете позволить второму просто заменить первое, как в приведенном выше сценарии.
Первые две опции требуют, чтобы вы отслеживали некоторое состояние перекрестного ajax-вызова, чтобы один ajax-вызов мог знать, есть ли другие, и действовать соответственно.