【问题标题】:Firebase Queries In a Factory工厂中的 Firebase 查询
【发布时间】:2016-12-26 05:00:53
【问题描述】:

我在 Firebase 查询中苦苦挣扎,我有这个工厂:

.factory("usuariosFac", ["$firebaseArray","$q","$firebaseObject",
    function($firebaseArray,$q,$firebaseObject) {
      return {

        getByEmail: function(email){
          var ref = firebase.database().ref("usuarios");
          var query=ref.orderByChild("email").equalTo(email).on("child_added", function(data) {
            console.log(data.val());
            return data.val();
          });
        }
      }

    }
])

这个功能在我的控制器里:

$scope.findUser = function() {
    $scope.usuario=usuariosFac.traeGrupoPorEmail($scope.formLogin.usuario);
};

当我运行它时,工厂内的控制台日志打印正常。但是$scope.usuario 是未定义的,这是为什么呢?

【问题讨论】:

  • 函数traeGrupoPorEmail从何而来?

标签: javascript angularjs firebase firebase-realtime-database angularfire


【解决方案1】:

但是$scope.usuario 是未定义的,这是为什么呢?

回调函数被异步调用嵌套函数中的return 语句不会将值返回给父函数。

相反,创建并返回一个承诺:

app.factory("usuariosFac", ["$firebaseArray","$q","$firebaseObject",
    function($firebaseArray,$q,$firebaseObject) {
      return {

        getByEmail: function(email){
          //Create defer object
          var future = $q.defer();
          var ref = firebase.database().ref("usuarios");
          var query=ref.orderByChild("email")
            .equalTo(email)
            .once("child_added",
                function onSuccess(data) {
                   console.log(data.val());
                   //RESOLVE
                   future.resolve(data.val());
                },
                function onReject(error) {
                   //OR REJECT
                   future.reject(error);
                }
            );
          //RETURN promise
          return future.promise;
        }
      }

    }
])

在控制器中,使用返回的promise的.then方法:

$scope.findUser = function() {
    var promise = usuariosFac.traeGrupoPorEmail($scope.formLogin.usuario);
    promise.then(function onSuccess(data) {
        $scope.usuario = data;
    }).catch(function onReject(error) {
        console.log(error);
        throw error;
    });
};

【讨论】:

  • 谢谢,工作正常。我认为“Once”功能做到了。
猜你喜欢
  • 2020-07-02
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多