【问题标题】:How to define an error callback in AngularJS?如何在 AngularJS 中定义错误回调?
【发布时间】:2017-02-22 12:48:00
【问题描述】:

在我的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.error 承诺属性。它当时可以工作,但迁移后它不再工作了。

我在这里做错了什么?

【问题讨论】:

  • 你需要从 Messages.create('Login failed: ' + data.statusText); 块中抛出
  • angulra 不喜欢投掷,返回$q.reject() 更好

标签: javascript angularjs promise angularjs-1.6


【解决方案1】:

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

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

创建一个被指定为rej​​ected的promise reason。这个 api 应该被用来在一个链中转发拒绝 承诺。如果您正在处理承诺链中的最后一个承诺, 你不必担心。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2016-11-03
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多