等待加载的数据,然后在AngularFire 0.9.0中返回

时间:2014-12-26 15:02:11

标签: javascript angularjs firebase angularfire

我有一个表单,我希望仅在用户提供有效的访问密钥($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,它似乎根本不会返回任何内容。

我做错了什么?

1 个答案:

答案 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");
        }
    });         
}