Javascript “$.post”中有多少被阻止?

Javascript “$.post”中有多少被阻止?,javascript,jquery,Javascript,Jquery,我有一个表单收集一些信息,我使用$.post来处理ajax请求 $.post(ajaxEndpoint, dataObject) .done(function (response) { if (response.status === 'success') { // Send data to process asynchronously otherApiCall(response.otherData); // Redirect to the tha

我有一个表单收集一些信息,我使用
$.post
来处理ajax请求

$.post(ajaxEndpoint, dataObject)
  .done(function (response) {
    if (response.status === 'success') {
      // Send data to process asynchronously
      otherApiCall(response.otherData);

      // Redirect to the thank you page
      window.location.replace(getThankYouUrl());
    }
  });

function otherApiCall (data) {
  $.post(otherAjaxEndpoint, data);
}
根据我的猜测,我的问题是,它在另一个
POST
生成之前重定向过快。但是我确实希望它异步发布,然后重定向,这样用户就不会等待第二个响应了。我不在乎第二次回答的结果是什么。我只想完成第一个响应,send第二次
POST
并立即重定向,以减少用户查看微调器的次数

我的第二个
$.post
似乎没有在重定向发生之前及时发送,因为我从未从中获取数据。如果我注释掉重定向,我会注释掉。我不想等到第二次
done()
完成,但我不知道如何才能不这样做。我不理解和/或做错了什么

补充资料/最新情况
我可以控制服务器端的处理。在这方面,我可以做些什么来快速获得响应,而不必等待其余的处理完成吗?

重定向可能会取消已排队但尚未发送的AJAX请求。尝试在超时后执行重定向,为第二个AJAX调用提供发送机会

$.post(ajaxEndpoint, dataObject)
  .done(function(response) {
    if (response.status === 'success') {
      // Send data to process asynchronously
      otherApiCall(response.otherData);

      // Redirect to the thank you page
      setTimeout(function() {
        window.location.replace(getThankYouUrl());
      }, 10);
    }
  });

不过,我不确定这有多可靠。也许更好的解决方案是在第二个AJAX调用转到
readystate==3
时执行重定向,这意味着服务器正在处理请求。没有jQuery接口,因此您可能必须使用低级的
XMLHttpRequest
接口来执行此操作。

您可能希望完成第二篇文章,然后执行重定向

一个简单的修复方法是从第二个方法返回
$.post
,并使用第二个调用的
done()
来管理重定向

$.post(ajaxEndpoint, dataObject)
  .done(function (response) {
    if (response.status === 'success') {
      // Send data to process asynchronously
      otherApiCall(response.otherData).done(function(){
          // second post call now complete
          // Redirect to the thank you page
          window.location.replace(getThankYouUrl());
      }).fail(function(){
           // handle failed response
       });      
    }
  });

function otherApiCall (data) {
  return $.post(otherAjaxEndpoint, data);
}

将数据发送回服务器而不必等待数据完成的最佳方法是使用API

引用MDN:

使用
sendBeacon()
方法,当用户代理有机会这样做时,数据将异步传输到web服务器,而不会延迟卸载或影响下一次导航的性能

您的数据将必须转换为、或,我不确定从技术上讲它是否是POST请求,但重定向后该请求将保持不变

Firefox 31+、Chrome 39.0+、Opera 26+目前都支持它。对于其他浏览器,您必须执行其他操作。您可以像这样进行特征检测

if (navigator.sendBeacon) {
    // Use sendBeacon API.
}
else {
    // Something else.
}

是的,我想过,但我觉得有点不舒服。我可能没有选择,虽然我希望请求会被重定向取消。无法知道它是否完成了发送。一旦它离开客户端,服务器不应该关心客户端是否正在等待响应。但是无法知道它是否在延迟中成功发送到服务器。如果连接被中断,它将失败。我的想法是,由于JS是单线程的,它将在处理队列中的超时条目之前完全完成发送AJAX请求。我知道我可以做到这一点,但问题是如何发送它并知道它正在被发送,而不使用
done()
。我不想等待回复,这是一个你无法知道的想法,除非它完成,所以我的问题的答案是,“不使用
done()
?”我不在乎第二个回复是什么,我想发送它并继续前进,成功还是失败。呼叫可能需要很长时间才能完成,用户无需wait@Grant-如果不等待响应或等待在所有流行浏览器中测试过的预定时间足以确保请求有时间发送,则无法确定是否已发送(黑客攻击)在你改变方向之前。这是你的两个选择。如果控制或影响服务器实现,则可以创建一个服务器调用,该调用立即返回,而无需等待整个操作完成,然后让服务器完成该操作。这样,返回很快,并且收到确认。@jfriend00,我确实可以访问服务器(php)脚本。你能给我一个如何做的例子吗?一个简单的
echo
就足够了吗?在服务器端,您可以让它派生一个新的进程来完成这项工作,并退出主脚本。
if (navigator.sendBeacon) {
    // Use sendBeacon API.
}
else {
    // Something else.
}