Firebase阵列总是返回false

问题描述:

我正在用离子和firebase创建应用程序。我试图验证一个元素是否存在于我的数组中,如果它存在,我需要返回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; 
} 

这里是我的火力strucure:

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

请发布您的Firebase结构的片段,请以文字方式发送,不要有图片。 – Jay

+0

- 保留 --KdS2cH1OJ5MhKAV6Yio -product: “produtc1” -user: “W30BB1RMg1XhNo9og9cMo4Gpr4S2” –

您的代码将无法工作,因为火力点以异步方式工作。

您应该使用一个回调函数作为参数,像这样:

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需要打破它返回true。你的来源不制动,有什么想法? (你是BR?) –

+0

@LucasGaspar,你应该评论/删除返回false,如果(data.val()。用户=== $ rootScope.currentUser。$ id)应该返回1记录不是多个,如果不是,那么代码必须重新写入forloop – digit

+0

@LucasGaspar Sim,BR!我认为你可以在forEach中调用回调之后添加'return;'。 –