Обещание Angular $http не разрешается

В настоящее время я работаю над созданием потока входа в систему в AngularJS 1.3. Моя проблема в том, что обещание, возвращаемое вызовом $http, не разрешает код внутри его «.then».

Я работаю над обработкой сообщений об ошибках, которые возвращаются с сервера, в частности, для обработки любых ошибок 401, которые возвращаются, когда пользователь вводит неправильное имя пользователя или пароль. Однако, когда возвращается 401, .then никогда не разрешается, и код внутри них никогда не запускается.

Соответствующий код выглядит следующим образом:

Контроллер для формы входа в качестве функции входа в свою область действия, а именно:

$scope.login = function() {
    $scope.authError = null;

    // Try to login
    var promise = session.login($scope.user);

    promise.then(function(loggedIn) {

        // THIS CODE NEVER RUNS

        if ( !loggedIn ) {
            $scope.authError = localizedMessages.get('login.error.invalidCredentials');
        }

    }, function(x) {
        $scope.authError = localizedMessages.get('login.error.serverError', { exception: x });
    });
};

У меня есть фабрика сеансов, которая заботится о входе в систему и других потребностях, связанных с сеансом. Код для входа:

login: function(credentials) {
    var $http = $injector.get('$http');
    var url = ENV.apiEndpoint + "/sessions";

    var newSession = $http.post(url, credentials);

    return newSession.then(function(data) {
        session.set(data.token);

        //THIS CODE ONLY RUNS ON A SUCCESS RESPONSE

        if(session.isAuthenticated()) {
            closeLoginModal(true);
        }

        return session.isAuthenticated();
    });
}

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

У меня работает перехватчик, но я пытался отключить его, но безрезультатно.

Я что-то упускаю?


person Octothorpe    schedule 05.12.2014    source источник
comment
Разве 401 не разрешит error (или как там это называется в Angular)? Функция ошибки работает?   -  person Dave Newton    schedule 05.12.2014
comment
Это устраняет ошибку, но если я прав, .then должен разрешаться независимо от того, было ли обещание успешным или ошибочным. Вторая функция .then в контроллере должна вызываться в случае ошибки. Я ошибаюсь в этом?   -  person Octothorpe    schedule 05.12.2014
comment
... Итак, он разрешается и запускает функцию ошибки. Это может показаться правильным, поскольку вызов HTTP приводит к коду ошибки HTTP. Может быть, вы неправильно описываете, что происходит: вызывается ли функция ошибки?   -  person Dave Newton    schedule 05.12.2014
comment
Он вызывается, но .then никогда не запускается. Может быть, я неправильно понимаю обещания. Я думал, что это «тогда» побежало, было ли это успехом или ошибкой...   -  person Octothorpe    schedule 05.12.2014
comment
Вы передаете две функции в then. Функция успеха и функция отказа. Если вы не передадите функцию отказа, она не будет запущена. Первая функция запускается только в случае успеха, а код ошибки HTTP 400+ не является успешным. Если ваш код устанавливает HTTP-код, вам необходимо принять это во внимание. Попробуйте добавить обработчик ошибок в код входа.   -  person Dave Newton    schedule 05.12.2014
comment
Спасибо! Сначала я безуспешно пытался передать вторую функцию then без успеха, пока не выключил свой перехватчик, который у меня работает. Теперь я регистрирую как минимум ошибку внутри обещания сеанса. Это может помочь мне отследить эту ошибку.   -  person Octothorpe    schedule 05.12.2014


Ответы (1)


Если ваш логин (на стороне сервера) возвращает код ошибки HTTP, например 401, это должно разрешить ошибку, например, вторая функция, переданная then. Если вы не пройдете один, он должен взорваться; вот почему вызывается ваша функция обработки ошибок более высокого уровня.

person Dave Newton    schedule 05.12.2014
comment
Спасибо, Дэйв. Это определенно было большой помощью. Я не отлаживаю перехватчик, но получаю нужные мне сообщения. - person Octothorpe; 05.12.2014