как вызвать функцию на глобальном ajaxSuccess () - обработка ошибок http-заголовка - PullRequest
1 голос
/ 27 октября 2011

, хотя я нашел много совпадений при поиске, но на самом деле я не нашел правильного решения моей проблемы: в моем скрипте у меня много AJAX-запросов.Во многих запросах я выполняю важные codenippets в пределах

$ajax{.. success: //code here.. }.

Теперь мне нужно проверить специальный http-response-header для обработки ошибок serverside с каждым успехом.Я не думаю, что было бы очень элегантно вызывать функцию handleHeaderFieldXYZ() в каждом отдельном запросе.Как я могу определить глобальный обработчик типа (ajaxSuccess, который просто вызывается для $(elem))?Если бы я определил успех в моей Ajax-Setup, я бы перезаписал его при вызове определенных локальных успехов.

Ответы [ 2 ]

1 голос
/ 27 октября 2011

Я обернул механизмы запроса / ответа jQuery AJAX и реализовал отложенные объекты.

Так что, когда сделан запрос, я могу работать с функцией под названием:

  • .done: обработчик запроса запроса
  • .fail: запрос обработчика ошибок

Я сделал это для того, чтобы реализовать универсальные обработчики для определенных ошибок запроса и позволить мне делать запросы AJAX и предоставлять функцию для обработки ответа более простым и менее загрязняющим способом.

Мне все еще нужно немного поработать над кодом, но основной принцип заключается в том, что реализацию AJAX можно удалить с помощью другой реализации, если стандартизированный результат остается на месте. Это означает, что другой разработчик может использовать оболочку для реализации своей собственной реализации AJAX, и вся логика в системах должна работать.

Этот код может работать для вас с вашим сценарием, если я правильно понимаю вашу проблему. Это еще не идеально, и вы можете улучшить это, я уверен, но я надеюсь, что это поможет.

Единственное, о чем я могу подумать, что вам может не хватать, это объект запроса AJAX для работы с заголовками. Я думаю, что он доступен в .done / .fail, иначе вы можете просто передать его, чтобы вы могли выполнить оценку.

Ниже приведена логика JavaScript для вызова оболочки AJAX:

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
0 голосов
/ 27 октября 2011

Вот еще один пост, который может быть простым подходом к вашей проблеме ...

Переопределить событие Ajax Success

Затем вы можете внутри этой функции добавить текущийсобытие после handlerHeaderFieldXYZ (), как вы упомянули выше

...