【问题标题】:Firebase array always return falseFirebase 数组总是返回 false
【发布时间】:2017-07-11 02:44:45
【问题描述】:

我正在使用 ionic 和 firebase 创建一个应用程序。我正在尝试验证我的数组中是否存在一个元素,如果存在,我需要返回 true,否则我需要返回 false。问题是,它总是返回 false,即使该项目存在于 firebase 中。你能告诉我下面的代码出了什么问题吗?

这是我的服务:

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

这是我的火力基地结构:

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

【问题讨论】:

  • 请发布您的 Firebase 结构的 sn-p,请作为文本,不要图像。
  • -保留 --KdS2cH1OJ5MhKAV6Yio -product: "produtc1" -user: "W30BB1RMg1XhNo9og9cMo4Gpr4S2"

标签: javascript firebase ionic-framework firebase-realtime-database


【解决方案1】:

您的代码将无法工作,因为 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");                
               }
            });
  }
            

你明白吗?

【讨论】:

  • 源代码有效,但 forEach 需要中断并返回 true。你的消息来源没有刹车,知道吗? (你是 BR?)
  • @LucasGaspar,你应该评论/删除返回 false 并且 if(data.val().user === $rootScope.currentUser.$id) 应该返回 1 条记录而不是多个,如果不是,那么必须重写代码以在 forloop 中添加中断
  • @LucasGaspar Sim,BR!我认为您可以在 forEach 中调用回调后添加一个return;
猜你喜欢
  • 2019-07-17
  • 2016-12-20
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多