gpt4 book ai didi

javascript - 异步函数和 javascript 变量范围的问题

转载 作者:行者123 更新时间:2023-11-30 17:08:25 25 4
gpt4 key购买 nike

我有以下调用 REST 网络服务的代码。 Web 服务返回一个 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 调用由于其异步特性还没有完成.

我不确定如何确保 valid 变量正确分配了从服务器返回的值。

有人可以帮忙吗?

编辑 1:

使用回调,似乎我只是将问题转移到 Controller 层......见下文:

来自 Angular 服务:

checkCurrentPassword: function (passwordInfo, callback) {
return $http.post('/api/preference/password/check', passwordInfo)
.success(function (data) {
callback(data);
});
}

来自 Angular Controller :

 $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:这是我重写 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');
});
}
});
}
};

最佳答案

您应该返回 $http.get 返回的 promise (HttpPromise),请参阅:https://docs.angularjs.org/api/ng/service/ $q 和 https://docs.angularjs.org/api/ng/service/ $http

这个例子可能对你有帮助:

angular.module('app',[]);

angular.module('app').service('Foo',function($q){

this.checkPassword = function(value){
//replace this example code with a $http call
console.log('checkPassword:',value);
var deferred = $q.defer();
setTimeout(function(){
if(value && value.length >= 4){
deferred.resolve(value);
} else {
deferred.reject('oops invalid password!!!');
}
},100);
return deferred.promise;
};

this.updatePassword = function(value){
//replace this example code with a $http call
console.log('updatePassword:',value);
var deferred = $q.defer();
setTimeout(function(){
if(Math.random() > 0.5){
deferred.resolve('password updated');
} else {
deferred.reject('error while updating password');
}
},100);
return deferred.promise;
};

});

angular.module('app').run(function(Foo){

Foo.checkPassword('tolkjlkj')
.then(Foo.updatePassword)
.then(function(result){
console.log('Yes',result);
}).catch(function(error){
console.log('Oops',error);
});

});

关于javascript - 异步函数和 javascript 变量范围的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27506970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com