javascript - Angular promise ( promise ?)。或者我如何在 Angular $http.success 之后链接 .then

标签 javascript angularjs promise

我在 Angular 中获得了一项服务:

App.factory('AuthService', function ($q, $http, CredentialStorage) {
  var _endpoint = 'http://localhost:3000';
  return {
    login: function (credentials) {
      return $http
        .post('/api/users/login', credentials)
        .success(function (apiResult) {
          var deferred = $q.defer();

          if (apiResult.code == 0) { 
            $scope.user = apiResult.context;
            CredentialStorage.store(apiResult.context);
          }

          return deferred.promise;
        })
        .fail(function(apiResult, status, headers) {
          var deferred = $q.defer();
          return deferred.promise;
        });
    },
....});

我对用户进行身份验证并将其存储在某些 cookie 或其他内容中(这不相关)。

然后在我的 Controller 上我得到:

App.controller('LoginController', function ($scope, $rootScope, AuthService) {
    var _login = function($event) {
        $event.preventDefault();

        AuthService.login($scope.l).then(function() {
            alert('aaa');
            if (!AuthService.authenticatedUser) {
                $scope.errors = ['Invalid username and password. Please try again.'];
                alert($scope.errors);
            } else {
                alert('a' + $scope.errors);
            }
        })
    }
    $scope.login = _login;
});

出于某种原因,我的 Controller 无法执行。这是为什么?

谢谢

最佳答案

嗯,简单的答案是:您使用链式的 .then 而不是仅添加监听器的 success:

App.factory('AuthService', function ($q, $http, CredentialStorage) {
  var _endpoint = 'http://localhost:3000';
  return {
    login: function (credentials) {
      return $http
        .post('/api/users/login', credentials)
        .then(function (response) {
          var apiResult = response.data;
          if (apiResult.code == 0) { 
              CredentialStorage.store(apiResult.context);
              return apiResult.context; // promises let you return the value
          }
          throw new Error("Authentication failed"); // return $q.reject
                                                    // if you don't want to invoke
                                                    // exceptionHandler
        });
    },
....});

这会让你这样做:

   AuthService.login($scope.l).then(function(result) {
        $scope.user = result;
   }).catch(function(err){
        // code to handle the case authorization failed or the API call failed
   });

从 Angular 关注点分离的 Angular 来看,修改服务/工厂/提供者中的 UI 范围通常是不好的。最好返回结果。

关于javascript - Angular promise ( promise ?)。或者我如何在 Angular $http.success 之后链接 .then,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23713779/

相关文章:

javascript - JS - 通过正则表达式搜索带引号和不带引号的字符串

angularjs - 在 AngularJS 中访问 JSONP 请求的真实 URL

javascript - 如何在javascript中使用promise获取多个图像文件信息

javascript - 依赖于异步调用的 JSON 迭代

javascript - jQuery/JavaScript : how to remove all elements in the first <li> except <a>text</a>

javascript - redux-form: <FieldArray> + <FormSection> 用于复杂的对象数组

javascript - 如何使用 jquery 将项目从一个列表移动到多个其他列表?

angularjs - 如何使用 $resource 读取响应 header ?

javascript - 带有子路由器的 Aurelia-Router 显示警告

Javascript 简单 If Else insideHTML == 'something' 不起作用