`$ .post`有多少阻塞?

时间:2015-11-06 01:23:44

标签: 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 thank you page
      window.location.replace(getThankYouUrl());
    }
  });

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

根据我的猜测,我遇到的问题是,在其他POST可以制作之前,它的重定向过快。但我希望它POST异步然后重定向,以便用户不等待第二个响应。我不在乎第二反应的结果是什么。我只想完成第一个响应,发送一秒POST并立即重定向以减少用户查看微调器。

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

其他信息/更新

控制服务器端处理。有没有什么东西可以做到这一点,以便快速得到响应,而无需等待剩余的处理完成?

3 个答案:

答案 0 :(得分:1)

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

一个简单的解决方法是从第二种方法返回$.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);
}

答案 1 :(得分:1)

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

navigator.sendBeacon('/url/to/handler', yourData);

来自MDN的报价:

  

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

您的数据必须分为ArrayBufferViewBlobDOMStringFormData,我不确定它在技术上是否是POST请求或不,但请求将在重定向后保留。

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

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

答案 2 :(得分:0)

重定向可能是取消已排队但尚未发送的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接口。