Ajax / jQuery在超时时中止

时间:2013-08-26 23:58:55

标签: jquery ajax abort

新手 - 奎斯顿 -

试图解决的问题:如果某些打开的连接没有被XMLHttprequest关闭,我们想要中止它们。

在javascript文件中,有Ajax调用,我需要为每个调用启动一个计时器,并在成功和失败回调中清除计时器。想要确保 - 如果计时器触发,则表示请求未返回,因此应该中止。对于暂时中止的情况,请求可能会回来 - 想要丢弃它们。想要在处理之前添加一个检查成功和失败回调的标志,并进行适当的处​​理。

想要添加这样的计时器:

    var timer = setTimeout(function() {         // Start a timer. If triggered,
                           timedout = true; // set a flag and then
                           request.abort(); // abort the request.
                       },
                       timeout);            // time specified

但是在给定的现有代码中,我发现很难理解从哪里启动计时器并中止。

        this.ajaxCall = function(urlSuffix, type, data, successCallback, errorCallback, callbackParam, logFlag)
 {
    if (!successCallback) {
        throw "A successCallback must be supplied";
    }
    if (!errorCallback) {
        throw "An errorCallback must be supplied";
    }
    var st = 0;
    if (logFlag !== false)
        st = LogMessageTestCL(urlSuffix + " - start: " + type, -1);
    $.ajax({
        url: urlRoot + urlSuffix,
        type: type,
        data: data,
        cache: false,

        success: function(msg) {
            try {
                if (logFlag !== false)
                    LogMessageTestCL(urlSuffix + " - end: " + type, st);
                successCallback(msg, callbackParam);
            }
            catch (e) {
                // this will only fail when the calling page is unloaded before the call returns, so no need to log this
            }
        },
        error: function(xhr,status) { 
            try {
                if (logFlag !== false)
                    LogMessageTestCL(urlSuffix + " - error end: " + type, st);
                if (status === "timeout") {
                    alert("30 sec time out");   
                    LogMessageTestCL("callback timed out");
                    return;
                }
                else if (status === "error") {
                    if (xhr.status != 200) {
                        errorCallback(xhr, callbackParam);
                    }
                }
                else
                    errorCallback(xhr, callbackParam);
            }
            catch (e) {
                // this will only fail when the calling page is unloaded before the call returns, so no need to log this
            }
        }
    });
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

没有必要自己实现逻辑,并且jquery提供了timeout选项,查看jQuery.ajax()的文档,有一个名为timeout的选项。

例如:

$.ajax({
    url: '',
    type: '',
    data: '',
    timeout: 30000, //time in milliseconds - 30000 equals 30 seconds,
    ......
})