工厂中的 Firebase 查询

Firebase Queries In a Factory

我正在努力处理 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 是未定义的,这是为什么?

But $scope.usuario is Undefined, why is this?

正在异步调用回调函数嵌套 函数中的 return 语句不会 return 向父函数赋值。

相反,创建并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;
        }
      }

    }
])

在控制器中,使用 returned 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;
    });
};