完全没有调用Ajax

时间:2015-08-31 15:00:41

标签: javascript jquery asp.net ajax visual-studio

我有这个常见的JavaScript函数来处理我的ASP.NET Web表单应用程序的所有Ajax请求:

var xsrf_token, IsAjaxAsync = true;
function callAjax(Handler, ajaxData, Cache, BeforeSend, Complete, Reset) {
    var URL = "http://" + window.location.host + "/Handlers/" + Handler + ".ashx";
    $.retryAjax({
        url: URL,
        type: "POST",
        timeout: 5000,
        retryLimit: 3,
        data: JSON.stringify({
            XSRFToken: xsrf_token,
            Data: ajaxData
        }),
        dataType: "json",
        cache: Cache,
        async: IsAjaxAsync,
        beforeSend: BeforeSend,
        success: function (data) {
            var resp = parseInt(data);
            if (resp != -10) {
                Complete(data);
            } else {
                $.prompt("Please login to perform this operation.", {
                    title: "Logged Out",
                    close: function () {
                        window.location.href = "http://" + window.location.host + "/Login";
                    }
                });
            }
        },
        complete: function () {
            UpdateHistory();
        },
        error: function (jqXHR, textstatus, error) {
            if (textstatus == 0) showConnectionError();
            if (Reset != null) Reset();
        }
    });
}

此函数实际上是使用此插件调用ajax:https://github.com/mberkom/jQuery.retryAjax

但似乎这个函数无法调用我希望在每种情况下调用的complete回调。是否发生错误,或请求是否成功,或者即使success回调返回false或其他错误。

我试图在第31行添加断点,但它没有到达那里。请告诉我如何在每种情况下调用此UpdateHistory()?我不希望在使用此callAjax()函数的每个函数中调用它。

我想问的另一件事是,如果success陷入某种无限循环或某些长期过程,那么仍然会调用complete吗?什么是跳过complete的各种情况?

1 个答案:

答案 0 :(得分:1)

正如您在retryAjax source的第21行所示,您的完整回调被覆盖,因为这是一个非常简单的插件,我建议您通过应用以下内容更改插件代码以满足您自己的需求改变:

ajaxParams.complete = function (jqXHR, textStatus) {
    if ($.inArray(textStatus, ['timeout', 'abort', 'error']) > -1) {
        this.tryCount++;
        if (this.tryCount <= this.retryLimit) {

            // fire error handling on the last try
            if (this.tryCount === this.retryLimit) {
                this.error = errorCallback;
                delete this.suppressErrors;
            }

            //try again
            $.ajax(this);
            return true;
        }

        //window.alert('There was a server error.  Please refresh the page.  If the issue persists, give us a call. Thanks!');
        ajaxParams.myCompleteCallback(jqXHR, textStatus);
    }
    ajaxParams.myCompleteCallback(jqXHR, textStatus);
}; 

然后,不要传递一个名为complete的完整回调,而只是传递一个名为myCompleteCallback的完整回调