页面重定向后JQuery POST中止

时间:2014-01-20 10:06:02

标签: javascript ajax post asynchronous

我有JQuery ajax POST操作,它将一些数据保存到数据库中。该操作大约需要不到20毫秒。这段javascript嵌入在.NET Web Forms应用程序中(不受我的控制)。此.NET应用程序在提交按钮内触发我的POST并重定向到另一个页面。现在,对于以下浏览器,永远不会执行POST:

  • Windows上的FF
  • Safari on MAC
  • Chrome on MAC

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垃圾收集器正在清理或者某些东西)。

2 个答案:

答案 0 :(得分:2)

或者,将async设置为false,您可以在window.location.href = "http://www.google.com";的{​​{1}}回调中重定向(success致电(并离开$.ajax):

async: true
希望有所帮助。

答案 1 :(得分:1)

在这种情况下,您使用async:false是合理且正确的。

弃用说明是指在jqXHR对象上设置回调处理程序,但您仍然通过选项对象提供它们。

在这种情况下使用async:false不会出错,因为页面无论如何都是关闭的,并且用户不会期望它是响应式的,所以执行阻止大部分都没有被注意到(除了接近20毫秒的事实)不可思议)。

从提供的信息来看,我没有看到比这更清晰的解决方案。