我有JQuery ajax POST操作,它将一些数据保存到数据库中。该操作大约需要不到20毫秒。这段javascript嵌入在.NET Web Forms应用程序中(不受我的控制)。此.NET应用程序在提交按钮内触发我的POST并重定向到另一个页面。现在,对于以下浏览器,永远不会执行POST:
IE工作正常,甚至是Windows上的Chrome。
所以我做了一些测试并尝试模仿.NET Web Forms网站,幸运的是我可以通过在我的保存操作后直接添加'window.location ='转到另一个网站来重现。这是我的(剥离的)代码:
//BUTTON
$('#someSaveButton').click(function () {
GlobalObject.save();
});
// GLOBAL OBJECT CONTAINING ALL MY ACTIONS (delete, check, save, get)
var GlobalObject = (function () {
return {
save: function () {
...
someMode.save(); //NOTE: Depending on an url parameter different save methods are supported
window.location.href = "http://www.google.com"; //MIMIC-ING REQUEST ABORTING
}
};
})();
//EVENTUALLY THE SAVE:
function save() {
$.ajax({
type: "POST",
cache: false,
url: ...,
data: ...,
contentType: "application/json",
dataType: "json",
success: function (response) {
...
},
error: function (msg) {
...
}
});
}
以上再现了相同的POST中止行为。注意:浏览器调试器到达$ .ajax语句但从不返回“成功”或“错误”。
我最终发现了一些问题: 我在ajax调用中添加了'async:false',一切似乎都运行正常!
现在我想确定这是否是正确的解决方案,因为当我在JQuery网站上阅读时:
从jQuery 1.8开始,不推荐使用async:false和jqXHR($ .Deferred);您必须使用success / error / complete回调选项而不是jqXHR对象的相应方法,例如jqXHR.done()或不推荐使用的jqXHR.success()。
我感觉'async:false'可能不是一个好的解决方案。我的Javascript构造好吗?我的背景是C#,我仍在学习/努力学习如何在javascript类定义中正确嵌入/使用函数。所以也许我的错误与我的函数的错误构造有关(并且javascript垃圾收集器正在清理或者某些东西)。
答案 0 :(得分:2)
或者,将async
设置为false,您可以在window.location.href = "http://www.google.com";
的{{1}}回调中重定向(success
)致电(并离开$.ajax
):
async: true
希望有所帮助。
答案 1 :(得分:1)
在这种情况下,您使用async:false是合理且正确的。
弃用说明是指在jqXHR对象上设置回调处理程序,但您仍然通过选项对象提供它们。
在这种情况下使用async:false不会出错,因为页面无论如何都是关闭的,并且用户不会期望它是响应式的,所以执行阻止大部分都没有被注意到(除了接近20毫秒的事实)不可思议)。
从提供的信息来看,我没有看到比这更清晰的解决方案。