如何在全局ajaxSuccess()上调用函数 - 错误处理http-header

时间:2011-10-27 08:18:05

标签: jquery ajax global

虽然我在搜索时发现了很多匹配但我找不到合适的解决方案我的问题: 在我的脚本中,我有很多AJAX请求。在许多请求中,我在

中执行重要的代码片段
$ajax{.. success: //code here.. }.

现在我需要验证一个特殊的http-response-header,以便在每次成功时处理错误serverside。我不认为在每个请求中调用函数handleHeaderFieldXYZ()会非常优雅。我怎么能定义一个像(ajaxSuccess,它只能为$(elem)调用)的全局处理程序?如果我在Ajax-Setup中定义成功,我会在调用已定义的本地成功时覆盖它。

2 个答案:

答案 0 :(得分:1)

我包装了jQuery AJAX请求/响应机制并实现了延迟对象。

因此,当发出请求时,我可以使用名为:

的函数
  • .done:请求成功处理程序
  • .fail:请求失败处理程序

我这样做是为了实现某些Request错误的通用处理程序,并允许我发出AJAX请求并提供一个函数来以更容易污染的方式处理响应。

我仍然需要在代码上多做一些工作,但基本原则是只要标准化结果保持不变,就可以通过其他实现删除AJAX的实现。这意味着另一个开发人员可以使用包装器来实现他/她自己的AJAX实现,并且系统中的所有逻辑仍然可以工作。

如果我正确理解您的问题,此代码可以适用于您的方案。这还不完美,你可以改进它我肯定但我希望它有所帮助。

我能想到的唯一可能缺少的是AJAX请求对象来处理标头。我认为它可以在.done / .fail中访问,否则你可以将它传递给你,以便你可以进行评估。

以下是调用AJAX包装器的JavaScript逻辑:

AJAXHandler.MakeServiceRequest("POST", serviceUrl, method, queryString, jsonFilterArgument)
    .done(function (requestResult) {
        // Handle Request Success
        if (requestResult.Data.Quote) {
            var quote = requestResult.Data.Quote;
            // handle quote
        } else {
            // handle no quote found
        }
        return this;
    })
    .fail(function () {
        // handle Request Failure
        return this;
    });

以下是AJAX包装器:

var jqueryAJAXHandler = function ($) {

    // private
    function ResponseHandler(data) {
        var dfd = $.Deferred();
        var obj;

        if (data.d) {
            obj = JSON.parse(data.d, JSON.IsoDateReviver); // we use iso standard for date transmission hence the isoDateReviver.
        } else {
            obj = JSON.parse(data, JSON.IsoDateReviver); // we use iso standard for date transmission hence the isoDateReviver.
        }

        if (obj === null || obj.RequestStatus === null) {
            // Every request made must respond with a requestStatus object as per standards.
            // If obj is null it means that requestStatus was not added to the response OR
            // an error occurred while chatting to the other server.
            var failResult = {
                RequestStatus: {
                    Status: 'error',
                    Type: 'malformedResponse',
                    Message: 'No Request Status object returned.'
                }
            };

            dfd.reject(failResult);
            return dfd.promise();
        }
        else if (obj.RequestStatus.Status === "error") {
            // Everything is in order up to this point.
            // we are now looking at a well formed response.
            // we just do not know if the request for processing
            // was successful.
            // We now look at the requestStatus object to figure
            // out if we were successful in proceessing.

            // ACCESS RIGHTS or INVALID SESSION error handler
            if (obj.RequestStatus.Type === "invalidSession") {
                dfd.reject(null); // close off current deferred object.
                return HelpejqueryAJAXHandlerr.GenericInvalidSessionHandler(obj); // return different promise.
            }
            else if (obj.RequestStatus.Type === "noAccess") {
                dfd.reject(null); // close off current deferred object.
                return jqueryAJAXHandler.GenericNoAccessHandler(obj); // return different promise.
            }

            dfd.reject(obj);
            return dfd.promise(); // all other errors are handled by custom error handlers.
        }

        dfd.resolve(obj);
        return dfd.promise();
    }

    // public
    return {
        GenericInvalidSessionHandler: function () {
            window.location.href = obj.RequestStatus.Url;
            return null;
        },
        GenericNoAccessHandler: function (obj) {
            var dfd = $.Deferred();
            // TODO : Implement generic no access rights error handler
            // must work accross any page.
            dfd.reject(obj);
            return dfd.promise();
        },
        GenericErrorHandler: function (obj) {
            var dfd = $.Deferred();
            alert("An error occurred while processing your request.  Please try again.  If this issue continues please inform your manager.");
            dfd.reject(obj);
            return dfd.promise();
        },

        MakeServiceRequest: function (requestType, serviceURL, methodName, queryString, objData) {
            var dfd = $.Deferred();

            //#region MakeServiceRequest

            // ORGANISE THE ARGUMENTS FOR THE REQUEST.
            // ensure the session id always goes through.
            var args = ""; 
            var blnProcessData = false;
            // convert arguments into JSON string for $.ajax request.
            // arguments come after the 4 reqd parameters

            //args = 
            // PROCESS URL
            // put href into loc var for easy reading.
            var loc = serviceURL + "/" + methodName;
            if (queryString != "") {
                loc = loc + "?" + queryString; //window.location.href;
            }

            // CALL WEB METHOD
            $.ajax({
                cache: false,
                async: true,
                type: requestType,
                url: loc,
                data: objData,
                processData: blnProcessData,
                contentType: "application/json;charset=utf-8",
                dataType: "json"
            })
                .success(function (data, textStatus, jqXHR) {
                    ResponseHandler(data)
                        .done(function (obj) {
                            dfd.resolve(obj);
                        })
                        .fail(function (obj) {
                            dfd.reject(obj);
                        });
                })
                .error(function (jqXHR, textStatus, errorThrown) {
                    // XMLHttpRequest Failed.
                    var failResult = {
                        RequestStatus: {
                            Status: 'error',
                            Type: textStatus,
                            Message: errorThrown
                        }
                    };
                    dfd.reject(failResult);
                });

            return dfd.promise();
            //#endregion MakeServiceRequest
        }
    }
};          // jqueryAJAXHandler

答案 1 :(得分:0)

这是另一篇文章,可能是解决问题的简单方法......

Override Ajax Success event

然后您可以在该函数内添加handlerHeaderFieldXYZ()之后的当前事件 如上所述