2017-02-21 62 views
0

我正在用離子和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」 –

回答

2

您的代碼將無法工作,因爲火力點以異步方式工作。

您應該使用一個回調函數作爲參數,像這樣:

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;'。 –