web-dev-qa-db-fra.com

Jquery $ .ajax statusCode Else

Dans un appel Ajax jquery, je gère actuellement le statusCode de 200 et 304. Mais j'ai également défini "Error" pour détecter les erreurs qui pourraient se reproduire.

S'il y a un message de validation lié, nous renvoyons le code d'état 400 - Bad Request.

Cela tombe alors dans la fonction "Erreur" avant de tomber dans la fonction statusCode "400" que j'avais définie. Ce qui signifie que deux actions se produisent.

Idéalement, je ne voudrais pas définir "Erreur" et "Succès" et ne définir que "statusCode" Mais ce dont j'ai besoin c'est d'avoir un "Else" pour ne pas avoir à déclarer chaque statusCode qui n'existe que les 2-3 I veulent gérer différemment.

$.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);
        }
    });
23
Steve

Étant donné que l'événement "complete" est toujours déclenché, vous pouvez simplement obtenir le code d'état à partir de là et ignorer les fonctions de réussite et d'erreur

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

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

    }else{

    }
}
28

Voici ce que j'utiliserais:

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

jQuery AJAX response complete, success, error sont obsolètes. Version plus à jour avec .done, .fail, .always promets à la place.

En cas de succès .always a la signature de .done, en cas d'échec, sa signature change en celle de .fail. En utilisant textStatus, vous pouvez saisir la variable correcte et renvoyer le contenu du corps.

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" );
});
2
MrYellow

Pour garder l'approche similaire à votre logique initiale, je continuerais à passer un objet statusCode. Cependant, vous savez toujours que "else" tombera dans le domaine des codes d'erreur de type 4xx ou 5xx.

Je voudrais donc mettre à jour votre code d'origine pour:

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);
    }
});
1
Scott Lobdell