2017-02-22 5 views
1

В моей Controller:Как определить обратный вызов ошибки в AngularJS?

function login(credentials) { 
    AuthService 
    .login(credentials) 
    .then(successCallback, errorCallback); 
    //same issue with .then(successCallback).catch(errorCallback); 
} 

function successCallback() { 
    // do something after success 
} 

function errorCallback(data) { 
    // do something after error 
} 

и в моем AuthService:

authService.login = function (credentials) { 
    return $http 
    .post(ENV.apiEndpoint + 'api/v1/login_check', credentials) 
    .then(
     function (result) { 
     Session.create(result.data.token, result.data.data); 
     }, 
     function (data) { 
     Messages.create('Login failed: ' + data.statusText); 
     } 
    ); 
} 

Когда мой POST обеспечивает код 200 ответов, все работает, как ожидалось do something after success выполняется.

Но когда мои результаты POST, например. в 401 я вижу, что Message.create вызывается (поэтому в этом случае он входит в путь error), но, к сожалению, мой контроллер вызывает successCallback, а не errorCallback.

Мне пришлось перенести это, потому что я использовал устаревшие и поскольку Угловые 1.6 удалены .success и .error атрибуты обещания. Тогда он работал, но после миграции это больше не работает.

Что я здесь делаю неправильно?

+0

вам нужно выбросить из 'Messages.create ('Логин не удалось:' + data.statusText);' блок –

+1

angulra не любит бросать, возвращение '$ q.reject()' лучше –

ответ

4

Вы можете отклонить обещание в обратном вызове ошибки.

authService.login = function (credentials) { 
    return $http 
    .post(ENV.apiEndpoint + 'api/v1/login_check', credentials) 
    .then(
     function (result) { 
     Session.create(result.data.token, result.data.data); 
     }, 
     function (data) { 
     Messages.create('Login failed: ' + data.statusText); 
     return $q.reject(data); 
     } 
    ); 
} 

От Angular $q doc:

reject(reason);

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

При сравнении deferreds/Обещание знакомого поведения TRY/поймать/броска, думать reject как throw ключевым слова в JavaScript. Это также означает, что если вы «поймаете» ошибку с помощью ошибки обещания , и вы хотите переслать ошибку на обещание, полученное от , текущее обещание, вы должны «перебросить» ошибку, возвращая отказ, построенный посредством reject.