Вопрос по javascript, jquery, ajax, http-status-codes – Jquery $ .ajax statusCode остальное

23

В вызове jjery Ajax я в настоящее время обрабатываю statusCode 200 и 304. Но у меня также есть «Ошибка». определяется & Quot; Чтобы поймать любые ошибки, которые могут вернуться.

Если есть сообщение о подтверждении, мы возвращаем код состояния 400 - Плохой запрос.

Это тогда попадает в «Ошибка» функционировать до попадания в statusCode "400" Функция, которую я определил. Что означает два действия.

В идеале я бы не хотел определять «ошибку» и & quot; Успех & quot; и определять только «statusCode» Но мне нужно иметь «остальное» так что мне не нужно объявлять каждый statusCode, который существует, только те 2-3, которые я хочу обработать по-разному.

<code>$.ajax({
        type: 'POST',
        contentType: "application/json",
        url: "../API/Employees.svc/" + EmployeeId + "/Company/" + CompanyId,
        data: jsonString,
        statusCode: {
            200: function () { //Employee_Company saved now updated

                hideLoading();
                ShowAlertMessage(SaveSuccessful, 2000);
                $('#ManageEmployee').dialog('close');

            },
            304: function () { //Nothing to save to Employee_Company

                hideLoading();
                $('#ManageEmployee').dialog('close');

                if (NothingToChange_Employee) {
                    ShowAlertMessage(NothingToUpdate, 2000);
                } else {
                    ShowAlertMessage(SaveSuccessful, 2000);
                }
            }
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            AjaxError(XMLHttpRequest, textStatus, errorThrown);
        }
    });
</code>

Ваш Ответ

4   ответа
2

JQuery AJAX ответcomplete, success, error были объявлены устаревшими Более современная версия с.done, .fail, .always обещаю вместо.

На успех.always имеет подпись.doneпри неудаче его подпись меняется на подпись.fail, С использованиемtextStatus Вы можете получить правильную переменную и вернуть содержимое тела.

var jqxhr = $.ajax( {
    type: frm.attr('method'),
    url: frm.attr('action'),
    data: frm.serialize(),
    dataType: 'json',
    } )

    .done(function( data, textStatus, jqXHR ) {
        alert( "success" );
    })
    .fail(function( jqXHR, textStatus, errorThrown ) {
        alert( "error" );
    })

    .always(function( data_jqXHR, textStatus, jqXHR_errorThrown ) {

        if (textStatus === 'success') {
            var jqXHR = jqXHR_errorThrown;
        } else {
            var jqXHR = data_jqXHR;
        }
        var data = jqXHR.responseJSON;

        switch (jqXHR.status) {
            case 200:
            case 201:
            case 401:
            default:
                console.log(data);
                break;
        }   

});

jqxhr.always(function() {
    alert( "second complete" );
});
jqXHR.error() устарела, а неerror возможностьjQuery.ajax(), Не знаю, является ли он неявным образом устаревшим вместе с ним, но, по крайней мере, он не задокументирован как устаревший.
10

Это то, что я использую:

error: function (xhr, textStatus, errorThrown) {
    switch (xhr.status) {
        case 401:
           // handle unauthorized
           break;
        default:
           AjaxError(xhr, textStatus, errorThrown);
           break;
    }
}
1

Чтобы сохранить подход, аналогичный вашей исходной логике, я бы продолжил передавать объект statusCode. Тем не менее, вы все еще знаете, что «еще» попадет в область кодов ошибок типа 4xx или 5xx.

Поэтому я бы обновил ваш оригинальный код:

var statusCodeResponses = {
    200: function () { //Employee_Company saved now updated

        hideLoading();
        ShowAlertMessage(SaveSuccessful, 2000);
        $('#ManageEmployee').dialog('close');

    },
    304: function () { //Nothing to save to Employee_Company

        hideLoading();
        $('#ManageEmployee').dialog('close');

        if (NothingToChange_Employee) {
            ShowAlertMessage(NothingToUpdate, 2000);
        } else {
           ShowAlertMessage(SaveSuccessful, 2000);
        }
    }
};

var genericElseFunction = function(response){
    // do whatever other action you wanted to take
};

for(var badResponseCode=400; badResponseCode<=599; badResponseCode++){
     statusCodeResponses[badResponseCode] = genericElseFunction;
}

$.ajax({
    type: 'POST',
    contentType: "application/json",
    url: "../API/Employees.svc/" + EmployeeId + "/Company/" + CompanyId,
    data: jsonString,
    statusCode: statusCodeResponses,
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        AjaxError(XMLHttpRequest, textStatus, errorThrown);
    }
});
28

Так как & quot; завершено & quot; событие всегда запускается, вы можете просто получить оттуда код состояния и игнорировать функции success и error

complete: function(e, xhr, settings){
    if(e.status === 200){

    }else if(e.status === 304){

    }else{

    }
}
Это, кажется, работает довольно хорошо и является хорошим ответом, хотя в моей ситуации я в итоге использовал как успех, так и неудачу. и сделайте аналогичное утверждение, если у вас есть выше в каждом. Steve
complete () теперь устарела. Использовать готово, терпеть неудачу, всегда методы замены.

Похожие вопросы