2017-02-21 21 views
0

Я создаю приложение с ионной и ударной базой. Я пытаюсь проверить, существует ли элемент в моем массиве, и если это так, мне нужно вернуть true, иначе мне нужно вернуть false. Проблема в том, что он всегда возвращает false, даже если элемент существует в firebase. Не могли бы вы рассказать мне, что происходит со следующим кодом?Массив Firebase всегда возвращает false

Вот моя служба:

function IsReserved(id){ 
    var ref = fb.child('/reserved/').orderByChild('product').equalTo(id); 
    ref.once("value").then(function(snapshot){ 
     snapshot.forEach(function(data){ 
      if(data.val().user === $rootScope.currentUser.$id){ 
       console.log(data.val().user + " * " + $rootScope.currentUser.$id); 
       return true; 
      } 
     }); 
    }); 

    return false; 
} 

Вот мой контроллер:

function Reservar(produto) { 
if(!$rootScope.cart){ 
    $rootScope.cart = []; 
    $rootScope.fprice = 0; 
} 

var user=$rootScope.currentUser; 
var res = vm.IsReserved(produto.$id); 
console.log(res); 


if(res){ 
    console.log("já reservado");     
    return; 
} 

Вот мой firebase strucure:

-reserved: 
    --KdS2cH1OJ5MhKAV6Yio: 
      -product: "product1" 
      -user: "W30BB1RMg1XhNo9og9cMo4Gpr4S2" 
+0

Пожалуйста, разместите фрагмент своей структуры Firebase, в тексте, пожалуйста, никаких изображений. – Jay

+0

-reserved --KdS2cH1OJ5MhKAV6Yio -произведения: "produtc1" -user: "W30BB1RMg1XhNo9og9cMo4Gpr4S2" –

ответ

2

Ваш код не будет работать, потому что firebase работает асинхронно ,

Вы должны использовать функцию обратного вызова в качестве параметра, что-то вроде этого:

function IsReserved(id, callback){ 
 
      var ref = fb.child('/reserved/').orderByChild('product').equalTo(id); 
 
      ref.once("value").then(function(snapshot){ 
 
       snapshot.forEach(function(data){ 
 
        if(data.val().user === $rootScope.currentUser.$id){ 
 
         console.log(data.val().user + " * " + $rootScope.currentUser.$id); 
 
         callback(true); 
 
         return; 
 
        } 
 
       }); 
 
      }); 
 
      
 
      return false; //-- This will always be executed before the code inside the .then, that's why your function always returns false 
 
     }

И на вас контроллер, что-то вроде этого:

function Reservar(produto) 
 
     { 
 
      if(!$rootScope.cart){ 
 
       $rootScope.cart = []; 
 
       $rootScope.fprice = 0; 
 
      } 
 

 
      var user=$rootScope.currentUser; 
 
      vm.IsReserved(produto.$id, function(response){ 
 
       console.log(response); 
 
       if(response){ 
 
       console.log("já reservado");     
 
       } 
 
      }); 
 
    } 
 
     

Не могли бы вы понять?

+0

источник работает, но Foreach нужно сломать и возвращает истину. Ваш источник не тормозит, никакой идеи? (Вы BR?) –

+0

@LucasGaspar, вы должны комментировать/удалять return false и if (data.val(). User === $ rootScope.currentUser. $ Id) должен возвращать 1 запись не несколько, если нет, то код должен быть переписан, чтобы добавить перерыв в forloop – digit

+0

@LucasGaspar Sim, BR! Я думаю, вы можете просто добавить «return;» после вызова обратного вызова внутри forEach. –