如何在AngularJS中定义错误回调?

LBA*_*LBA 3 javascript promise angularjs angularjs-1.6

在我的Controller:

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
}
Run Code Online (Sandbox Code Playgroud)

在我的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);
       }
    );
}
Run Code Online (Sandbox Code Playgroud)

当我POST发送200响应代码时,一切按预期do something after success执行.

但是当我的POST结果例如在401中我可以看到Messages.create被调用(所以在这种情况下它进入error路径),但不幸的是我的控制器调用successCallback而不是errorCallback.

我不得不迁移这个,因为我使用的是已弃用的,因为Angular 1.6已删除.success.error承诺属性.它当时正在运作,但在迁移后,这不再起作用了.

我在这做错了什么?

Mis*_*lis 6

您可以在错误回调中拒绝承诺.

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);
       }
    );
}
Run Code Online (Sandbox Code Playgroud)

来自Angular $ q doc:

reject(reason);

创建一个使用指定的拒绝解析的promise reason.这个api应该用于在一系列承诺中转发拒绝.如果您正在处理承诺链中的最后一个承诺,则无需担心.

将延迟/承诺与熟悉的try/catch/throw行为进行比较时,请将其reject视为throwJavaScript中的关键字.这也意味着如果您通过promise错误回调"捕获"错误并且您希望将错误转发到从当前promise中派生的promise,则必须通过返回通过构造的拒绝来"重新抛出"错误reject.