3

在我的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
}

在我的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 时,我可以看到 Messages.create 被调用(所以在这种情况下它进入了error路径),但不幸的是我的控制器调用了successCallback而不是errorCallback.

我不得不迁移它,因为我使用的是不推荐使用的,并且因为 Angular 1.6 删除了.success.errorpromise 属性。它当时正在工作,但迁移后它不再工作了。

我在这里做错了什么?

4

1 回答 1

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);
       }
    );
}

来自Angular $q 文档

reject(reason);

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

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

于 2017-02-22T13:03:28.627 回答