我有一个表单收集了一些我使用$.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()
,但我无法想象如何不去。我不理解和/或做错了什么?
我做控制服务器端处理。有没有什么东西可以做到这一点,以便快速得到响应,而无需等待剩余的处理完成?
答案 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服务器,而不会延迟卸载或影响性能下一个导航。
您的数据必须分为ArrayBufferView
,Blob
,DOMString
或FormData
,我不确定它在技术上是否是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
接口。