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()()
返回成功时的响应调用时它应该可用。然后()
。请检查更新。我按照您的指示发布了我的编辑代码?我得到了相同的行为