开发者问题收集

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

2016-04-24
133

我已经创建了以下服务。

    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 值的结果时,我得到了“未定义”:

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

console.log(userProfileFactory.userProfile())

}]);

请提供建议:)

1个回答

是的,您可以在尝试以异步方式获取数据的地方创建一个自定义承诺,方法是借助 $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);
    })
}]);
Pankaj Parkar
2016-04-24