Javascript 角度js中的链接承诺

Javascript 角度js中的链接承诺,javascript,angularjs,q,Javascript,Angularjs,Q,在这方面,我遇到了意想不到的麻烦。我有一个登录控制器,当我执行登录功能时 $scope.Login = function () { AuthService.login($scope.credentials).then(function(response){ $location.path('/categories'); }, function(error){ $scope.error_exist = true; switch(e

在这方面,我遇到了意想不到的麻烦。我有一个登录控制器,当我执行登录功能时

$scope.Login = function () {

    AuthService.login($scope.credentials).then(function(response){
        $location.path('/categories');
    },
     function(error){
        $scope.error_exist = true;
     switch(error.ExceptionMessage){
        case "201" :
             $scope.error = "The emailAddress/password pair don't match an existing member"; break;
        case "210" :
             $scope.error = "Value cannot be null missing Email Address and/or password."; break;
        case "202" :
             $scope.error = "The email address you are using isn't confirmed. Please see your inbox for further instructions."; break;
        default : 
             $scope.error = "Error with the server";
     }
    });
};
发生的情况是,
AuthService
中的登录函数在点击
AccountService.GetUserAccounts
时执行,这是它回调的服务中的另一个函数
$location.path(“/categories”)在登录控制器中,之后它继续正常执行,我想调用
$location.path('/categories')登录后在
AuthService
中完成。 她是
AuthService

return $http.post(AuthentoctionControllerUrl, credentials).success(function(response){
               Session.create(response.Name,response.id, response.UserMail);
               AccountService.GetUserAccounts(response.id).then(function(){
                  var acc = AccountService.getAccounts();
                  AccountService.SetUserAccount(acc[0], response.UserMail).then(function(){
                      accIsSet.accSet = true;
                  },
                  function(error){
                      console.log(error);
                  });
               },
               function(error){
                   console.log(result);
               });

            deferred.resolve(response);
           }).error(function(error){
               deferred.reject(error);
           });

            return deferred.promise;
        };
AccountFactory.GetUserAccounts = function(userID){
            var deferred = $q.defer();
            return $http({method : "post", url:ConfigService.baseUrl+UserURl, data: userID})
                         .success(function(response){
                            for(var i = 0; i<response.length; i++)
                            userAccounts.push(response[i].AccName);
                            $cookieStore.put("userAccounts",userAccounts);
                            deferred.resolve(response);
                         }).error(function(error){
                            deferred.reject(error);
                            console.log(error);
                         });
                return deferred.promise;
        };

        AccountFactory.SetUserAccount = function(accName, userMail){
            var deferred = $q.defer();
                        return $http({method : "post", url:ConfigService.baseUrl+AccountUrl+"?accName="+accName+"&userMail="+userMail})
                         .success(function(response){
                            $cookieStore.put('AuthorizationHeader', response.Token);
                            AccSession.create(response.IsAdmin);
                            deferred.resolve(response);
                         }).error(function(error){
                            deferred.reject(error);
                            console.log(error);
                         });
                return deferred.promise;
        };
AccountFactory.getAccounts = function(){
    if(userAccounts)
        return userAccounts;
    else
        return null;
};
还有
AccountService

return $http.post(AuthentoctionControllerUrl, credentials).success(function(response){
               Session.create(response.Name,response.id, response.UserMail);
               AccountService.GetUserAccounts(response.id).then(function(){
                  var acc = AccountService.getAccounts();
                  AccountService.SetUserAccount(acc[0], response.UserMail).then(function(){
                      accIsSet.accSet = true;
                  },
                  function(error){
                      console.log(error);
                  });
               },
               function(error){
                   console.log(result);
               });

            deferred.resolve(response);
           }).error(function(error){
               deferred.reject(error);
           });

            return deferred.promise;
        };
AccountFactory.GetUserAccounts = function(userID){
            var deferred = $q.defer();
            return $http({method : "post", url:ConfigService.baseUrl+UserURl, data: userID})
                         .success(function(response){
                            for(var i = 0; i<response.length; i++)
                            userAccounts.push(response[i].AccName);
                            $cookieStore.put("userAccounts",userAccounts);
                            deferred.resolve(response);
                         }).error(function(error){
                            deferred.reject(error);
                            console.log(error);
                         });
                return deferred.promise;
        };

        AccountFactory.SetUserAccount = function(accName, userMail){
            var deferred = $q.defer();
                        return $http({method : "post", url:ConfigService.baseUrl+AccountUrl+"?accName="+accName+"&userMail="+userMail})
                         .success(function(response){
                            $cookieStore.put('AuthorizationHeader', response.Token);
                            AccSession.create(response.IsAdmin);
                            deferred.resolve(response);
                         }).error(function(error){
                            deferred.reject(error);
                            console.log(error);
                         });
                return deferred.promise;
        };
AccountFactory.getAccounts = function(){
    if(userAccounts)
        return userAccounts;
    else
        return null;
};
AccountFactory.GetUserAccounts=函数(userID){
var deferred=$q.deferred();
返回$http({method:“post”,url:ConfigService.baseUrl+UserURl,data:userID})
.成功(功能(响应){

for(var i=0;i服务在调用时返回承诺。承诺有方法。然后().catch().finally(),也返回承诺。此外,$http服务的.success().error()方法返回一个承诺。因此,通过
$q.defer()
创建一个承诺并像这样解析它是多余的。如果您想在成功时获得响应值,只需返回它,如下所示

更改您的
AuthService.login()
以返回如下内容:

return $http.post(AuthentoctionControllerUrl, credentials)
    .success(function(response) {
        Session.create(response.Name,response.id, response.UserMail);

        return AccountService.GetUserAccounts(response.id)
            .then(function(acc) {
                return AccountService.SetUserAccount(acc[0], response.UserMail);
            }).then(function() {
                accIsSet.accSet = true;
            });
    });
您的
AccountFactory
将:

AccountFactory.GetUserAccounts = function(userID){
    return $http({method : "post", url:ConfigService.baseUrl+UserURl, data: userID})
         .success(function(response){
            for(var i = 0; i<response.length; i++)
                userAccounts.push(response[i].AccName);
            $cookieStore.put("userAccounts",userAccounts);
            return response;
         });
};

AccountFactory.SetUserAccount = function(accName, userMail){
    return $http({method : "post", url:ConfigService.baseUrl+AccountUrl+"?accName="+accName+"&userMail="+userMail})
        .success(function(response){
            $cookieStore.put('AuthorizationHeader', response.Token);
            AccSession.create(response.IsAdmin);
            return response;
        });
};
AccountFactory.GetUserAccounts=函数(userID){
返回$http({method:“post”,url:ConfigService.baseUrl+UserURl,data:userID})
.成功(功能(响应){

对于(var i=0;i我设法借助@ryeballar解决了这个问题

authService.login = function(credentials) {
            var defferd = $q.defer();
            $http.post(AuthentoctionControllerUrl, credentials).success(function(response){
               Session.create(response.Name,response.id, response.UserMail);
              return AccountService.GetUserAccounts(response.id).then(function(acc){
                  if(acc.data.length !=0)
                    return AccountService.SetUserAccount(acc.data[0].AccName, response.UserMail);
                  else
                      return 0;
              }).then(function(data) {
                  if(data)
                    accIsSet.accSet = true;

                  defferd.resolve(response);
              });
           }).error(function(error){
                defferd.reject(error);
            });
                return defferd.promise;
        };

修改了身份验证服务以解决成功结束时的承诺方法,因此控制器中的方法将按预期启动

感谢您指出错误处理。但我仍然有相同的行为,$location.path('/categories');在var acc=AccountService.getAccounts()之前执行;在Auth服务中,我对AuthService.login()做了一些小改动,以显示链接承诺的工作方式。检查它是否工作。AccountService.getAccounts();不发出HTTP请求,我将编辑我的问题以表示抱歉,我仍然拥有相同的beauvoirI。我已更新了
AuthService.login()
,因为
AccountFactory.GetUserAccounts()()
返回成功时的响应调用
时它应该可用。然后()
。请检查更新。我按照您的指示发布了我的编辑代码?我得到了相同的行为