2016-06-23 3 views
0

У меня есть приложение Ruby on Rails 4.2.Rails UJS: прервать ранее запущенные, но все еще активные запросы ajax при запуске нового запроса ajax

У меня есть 3 кнопки, которые вызывают AJAX запросы с Rails UJS

<section id="buttons"> 
    <%= link_to image_tag(image), 
     button1_modal_path, 
     remote: true, 
     id:"icon1", 
     data: { disable_with: '' } %> 
    <%= link_to image_tag(image), 
     button2_modal_path, 
     remote: true, 
     id:"icon2", 
     data: { disable_with: '' } %> 
    <%= link_to image_tag(image), 
     button3_modal_path, 
     remote: true, 
     id:"icon3", 
     data: { disable_with: '' } %> 
</section> 

Я хотел бы реализовать следующую схему:

  • пользователь нажимает на кнопку 1 начинает запрос AJX XHR (пусть (s назовите его ajaxRequest1)

  • ajax все еще обрабатывается (и независимо от того, в каком состоянии он включен: отправлено, уже обработано сервером, на нем обратно) ... но не имеет t прибыл (200), и пользователь нажимает кнопку 2, запуская другой запрос xhr ajax (ajaxRequest2)

  • Я хотел бы в этом случае, чтобы все остальные активные запросы ajax (то есть в этом случае ajaxRequest1) были отменены. Если там было больше, чем только один больше запросов, было бы отменить их все, кроме запроса последнего АЯКСА (т.е. ajaxRequest2)

Я попытался это с помощью Rails UJS ajax events, но он не работает (он фактически отменяет любой Аякс запрос срабатывать :(:

on('ajax:beforeSend',function(event, xhr, settings){ 
    xhr.onreadystatechange = null; 
    xhr.abort(); 
} 

ПРИМЕЧАНИЕ: Я хотел бы, в лучшем случае, что я не только отменить тот факт, что браузер ожидает возвращения запроса Ajax и отобразить его содержимое, но также, что если запрос был запущен, но еще не попал на сервер, он отменяется до того, как он попал на сервер, чтобы не перекрывать oad сервер с бесполезным запросом ajax.

ответ

1

Для отмены запроса 1, вы должны вызвать аборт на XMLHttpRequest объекта в соответствии с запросом 1, например

ajaxRequest1.abort(); 

Смысл вашего кода, чтобы отменить запрос перед его отправкой.

on('ajax:beforeSend',function(event, xhr, settings){ 
    xhr.onreadystatechange = null; 
    xhr.abort(); 
}