Rails UJS:在触发新的 ajax 请求时中止先前触发但仍处于活动状态的 ajax 请求

Rails UJS: abort previously triggered but still active ajax requests when triggering a new ajax request

我在 Rails 4.2 应用程序上有一个 Ruby。

我有 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>

我希望实现以下模式:

我使用 Rails UJS ajax events 尝试过,但它不起作用(它实际上取消了任何 ajax 请求被触发:(:

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

注意:我希望在最好的情况下,我不仅要取消浏览器正在等待 ajax 请求 return 并显示其内容的事实,还要 ALSO如果请求已经启动但尚未到达服务器,它会在它到达服务器之前被取消,以免服务器因无用的 ajax 请求.

而过载

要取消请求1,需要根据请求1在XMLHttpRequest对象上调用abort,例如

ajaxRequest1.abort();

您的代码的意思是在请求发送之前中止请求。

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

如果任何时候只有一个 rails 远程调用 运行,您可以记住当前的 XHR 并在新的 XHR 启动时中止它,即

var currentXhr;
currentXhr = null;

$(document).on('ajax:send', function(_event, xhr) {
  if (currentXhr) {
    currentXhr.abort();
  }
  currentXhr = xhr;
  return true;
});
$(document).on('ajax:complete', function(_event, _xhr, _status) {
  currentXhr = null;
});