1

я борюсь с Firebase запросов, у меня есть этот завод: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); 
}; 

Когда я запускаю его, консоль Log внутри фабрики печатает отлично. Но $scope.usuario не определено, почему это?

+0

Где функция 'traeGrupoPorEmail' взялось? –

ответ

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; 
     } 
     } 

    } 
]) 

В контроллере, используйте метод .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; 
    }); 
}; 
+0

Спасибо, отлично работает. Я думаю, что функция «Once» сделала это. –

Смежные вопросы