getJSON在页面刷新时中断(F5)。怎么修?

时间:2013-09-05 18:05:05

标签: c# javascript jquery asp.net ajax

我有一个ajax调用,每5秒触发一次,以更新屏幕上的某些数据。似乎页面刷新后getJSON中断了。似乎正在发生的事情是,如果在呼叫发生时通过F5刷新页面,则将来的呼叫将不起作用。它们只是失败而没有错误消息。 textStatus是错误的,但是errorthrown是空的。我正在调用Asp.Net MVC控制器,那里没有错误。后续的getJSON调用永远不会命中服务器。在我开始和停止我的网站之前,此时已经非常流行了。不知道如何解决这个问题,因为我无法阻止用户刷新页面,这对我来说是一次测试更新的痛苦。

这是我的代码:

var RealTimeActivity = (function () {
    var realTimeActivity = {};
    var timer = null;
    var active = false;

    realTimeActivity.LastUpdated = new Date();

    function queueUpdate() {
        timer = setTimeout("RealTimeActivity.Update();", 5000);
    }

    function reset() {
        clearTimer();
        queueUpdate();
    }

    function clearTimer() {
        if (timer) {
            clearTimeout(timer);
            timer = null;
        }
    }

    realTimeActivity.Update = function () {
        try {
            clearTimer();
            if (active === true) {
                $.getJSON("realTimeActivity/GetRealTimeData",
                    function (result) {
                        if (result.Success) {
                           // do stuff
                        } else {
                           // Other stuff
                        }

                        queueUpdate();
                    }
                ).fail(function (jqXHR, textStatus, errorThrown) {
                    console.log(textStatus + ": " + errorThrown);
                    reset();
                })
            }
        } catch (ex) {
            reset();
        }
    }

    realTimeActivity.Start = function (i) {
        active = true;
        if (i) {
            realTimeActivity.Update();
        } else {
            queueUpdate();
        }
    }

    realTimeActivity.Stop = function () {
        active = false;
        clearTimer();
    }

    return realTimeActivity;
}());

修改 这似乎只能在Chrome中重现。也许是Chrome中的错误,或者我错过了什么?

1 个答案:

答案 0 :(得分:2)

这似乎是Chrome和已中止请求的缓存问题。即使在刷新页面后,一旦请求中止,它也不允许我向同一URL发送另一个请求。我通过使每个请求都是唯一的(通过时间戳)来解决它。

  postRequest('realTimeActivity/GetRealTimeData?u=' + (new Date).getTime(), null, function (response) {

显然你也可以调用$ .ajax并将cache设置为false,这在幕后做同样的事情。