我有一个表单,我希望仅在用户提供有效的访问密钥($scope.access_key
)时发送该表单 - 并且每个密钥只能使用一次。
在我的控制器中,我有以下方法:
$scope.verifyAccess = function() {
var ref = new Firebase(FBURL+'/keys');
var sync = $firebase(ref);
$scope.keys = sync.$asArray();
var success = false;
$scope.keys.$loaded( function(KEYS) {
for( var i = 0; i < KEYS.length; i++ ) {
var e = KEYS[i];
console.log(e.key + " " + e.used);
if( e.key === $scope.access_key && e.used == false ) {
e.used = true;
$scope.keys.$save(i);
success = true;
break;
}
}
if( success ) {
console.log("success");
return true;
} else {
console.log("failure");
return false;
}
});
}
然后我就这样使用它:
$scope.addSurvey = function() {
if( $scope.verifyAccess() ) {
// do something
alert("OK");
}
};
当我呼叫$scope.addSurvey()
时,我在日志中看到“成功”(并且数据库已正确修改),但alert("OK")
不会触发。
如果我不使用$loaded
,方法会立即返回,并且不会等待加载和处理数据。另一方面,如果我使用$loaded
,它似乎根本不会返回任何内容。
我做错了什么?
答案 0 :(得分:2)
根据the documentation,$loaded()
“返回从Firebase下载初始记录后解析的承诺。”您可以使用.then
在该承诺上链接函数,或者只是将1个回调作为参数传递,如上所述。但是,您将从该回调返回,而不是从$scope.verifyAccess
返回。
您将不得不将其转换为更多异步代码。有几种方法可以做到这一点;您可以$scope.verifyAccess
将某些hasAccess
变量更新为true
&amp;然后回复一个承诺。然后$scope.addSurvey
看起来像:
$scope.addSurvey = function() {
$scope.verifyAccess()
.then(function(){
if( hasAccess ){
// do something
alert("OK");
});
};
上述方法需要使用promise库,这对于学习和熟悉是很有价值的。或者,您可以让$scope.verifyAccess
在实际验证用户是否有权访问后执行回执:
$scope.verifyAccess = function(callback) {
var ref = new Firebase(FBURL+'/keys');
var sync = $firebase(ref);
$scope.keys = sync.$asArray();
var success = false;
$scope.keys.$loaded( function(KEYS) {
for( var i = 0; i < KEYS.length; i++ ) {
var e = KEYS[i];
console.log(e.key + " " + e.used);
if( e.key === $scope.access_key && e.used == false ) {
e.used = true;
$scope.keys.$save(i);
success = true;
break;
}
}
if( success ) {
console.log("success");
callback();
} else {
console.log("failure");
}
});
}