如何在AngularFire中返回异步函数结果

时间:2016-04-24 15:51:18

标签: angularjs asynchronous firebase angularfire

我在下面创建了这项服务。

    app.factory('userProfileFactory', ['FBDB', 'searchParam', function(FBDB, searchParam) {
            var personalKey;
        return {

            userProfile: function() {
                var FBref = new Firebase(FBDB).child('items');
                FBref.orderByChild('first')
                    .startAt(searchParam)
                    .endAt(searchParam)
                    .once('value', function (snapshot) {
                    var data = snapshot.val();

                        personalKey = Object.keys(data)[0];

                        return(personalKey);     
                });

                return(personalKey);

            }
        };
    }]);

但是,当我尝试在下面的控制器中获取personalKey的值的结果时,我得到" undefined":

app.controller('profileCtrl', ['userProfileFactory', function(userProfileFactory) {

console.log(userProfileFactory.userProfile())

}]);

请建议:)

1 个答案:

答案 0 :(得分:3)

是的,您可以通过$q

的帮助,在您试图以异步方式获取数据的地方创建自定义承诺
userProfile: function() {
  var deferred = $q.defer();
  var FBref = new Firebase(FBDB).child('items');
  var promise = FBref.orderByChild('first')
  .startAt(searchParam)
  .endAt(searchParam)
  .on('value', function(snapshot) {
    var data = snapshot.val();
    personalKey = Object.keys(data)[0];
    deferred.resolve(personalKey);
  });
  return deferred.promise
}

然后控制器将使用.then函数调用工厂函数来链接承诺。

app.controller('profileCtrl', ['userProfileFactory', function(userProfileFactory) {
    userProfileFactory.userProfile().then(function(res){
      console.log(res);
    })
}]);