1

我有一个 ajax 调用,每五秒触发一次以更新屏幕上的一些数据。似乎 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 中的错误,或者我错过了什么?

4

1 回答 1

2

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

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

显然您也可以调用 $.ajax 并将缓存设置为 false 以及在幕后做同样的事情。

于 2013-09-10T17:58:27.383 回答