问题描述
限时送ChatGPT账号..我有以下调用 REST 网络服务的代码.Web 服务返回一个 boolean
.
I have the following code that calls an REST webservice. The web service returns a boolean
.
checkCurrentPassword: function (passwordInfo) {
var valid = false;
$http.post('/api/preference/password/check', passwordInfo)
.success(function (data) {
valid = data;
});
return valid;
}
问题在于,当 checkCurrentPassword
返回 valid
时仍然是 false
,因为 ajax 调用由于其异步性质而尚未完成.
The trouble is that by the time the checkCurrentPassword
returns valid
is still false
because the ajax call has not completed due to its asynchronous nature.
我不确定如何确保 valid
变量被正确分配为从服务器返回的值.
I am not sure how to make sure the valid
variable is properly assigned the value returned from the server.
有人可以帮忙吗?
编辑 1:
使用回调,看来我只是将问题驱逐到控制器层...见下文:
Using a callback, It seems I am only deporting the problem to the controller layer... See below:
来自 Angular 服务:
checkCurrentPassword: function (passwordInfo, callback) {
return $http.post('/api/preference/password/check', passwordInfo)
.success(function (data) {
callback(data);
});
}
来自角度控制器:
$scope.updatePassword = function () {
if ($scope.updatePasswordForm.$valid) {
var valid = false;
passwordService.checkCurrentPassword({plainPassword: $scope.passwordInfo.currentPassword}, function(data, status){
valid = data;
});
console.log(valid);//always false
passwordService.updatePassword($scope.passwordInfo, function (data, status) {
console.log('Updated password successfully');
$state.go('dashboard');
});
}
};
编辑 2:这是我重写控制器的方式:
edit 2: here is how I rewrote the controller:
$scope.updatePassword = function () {
if ($scope.updatePasswordForm.$valid) {
passwordService.checkCurrentPassword({plainPassword: $scope.passwordInfo.currentPassword}).success(function (data) {
if (data) {
passwordService.updatePassword($scope.passwordInfo, function (data, status) {
console.log('Updated password successfully');
$state.go('dashboard');
});
}
});
}
};
推荐答案
你应该使用 angulars 的内置 $q 服务
你的函数看起来像这样.(确保在顶部的代码中注入 $q)
You're function would look something like this. (make sure to inject $q into your code at the top)
checkCurrentPassword: function (passwordInfo) {
var deferred = $q.defer();
var valid = false;
$http.post('/api/preference/password/check', passwordInfo)
.success(function(data){
valid = data;
deferred.resolve();
})
.error(function(error){
deferred.reject();
});
return deferred.promise;
};
这篇关于异步函数和javascript变量范围的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
更多推荐
[db:关键词]
发布评论