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

How Can Asynchronous Function Result Be returned in 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())

}]);

请指教:)

是的,您可以通过 $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
}

然后 controller 会调用带有 .then 函数的工厂函数来链式承诺。

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