【问题标题】:For loop not working properly after dbRefObjectdbRefObject 后 For 循环无法正常工作
【发布时间】:2020-01-30 21:17:16
【问题描述】:

matchIDes[i] 包含 3 个不同的 match_ID,我希望每个 id 都能访问 firebase 并在快照中收集数据并返回数据,但它只返回最后一个 id 的数据。

for(i=0;i<=arry-1;i++) {
    matchIDes.push(response.data.MatchOdds[i].matchId);

    var dbRefObject = firebase.database().ref().child('Game').child(matchIDes[i]);

    dbRefObject.on('value', function(snapshot) {
        var x = snapshot.val();
        for(i=0;i<=matchIDes.length-1;i++){
            var a = x.AllQuestion[0].EventQuestion;
            var c = x.AllQuestion[0].Options[0].GameAnswer;
            var d = x.AllQuestion[0].Options[0].odds;
            var e = x.AllQuestion[0].Options[1].GameAnswer;
            var f = x.AllQuestion[0].Options[1].odds;
            var g = x.AllQuestion[0].QuestionId;

            $("#" + matchIDes[i] + "_Quest").text(a);
            $("#" + matchIDes[i] + "_optA").text(b);
            $("#" + matchIDes[i] + "_rankA").text(c);
            $("#" + matchIDes[i] + "_optB").text(d);
            $("#" + matchIDes[i] + "_rankB").text(e);

            $scope.$apply();
        }
    });         
}

【问题讨论】:

    标签: javascript jquery angularjs firebase-realtime-database


    【解决方案1】:

    重构代码以仅使用一个事件处理程序:

    var matchOddsArr = response.data.MatchOdds;
    var dbRefObject = firebase.database().ref().child('Game');
    
    dbRefObject.on('value', function(snapshot) {
        snapshot.forEach(function(childSnap) {
            matchOddsArr.forEach(function(matchObj) {
                var id = matchObj.matchId;
                if (childSnap.key == id) {
                    var x = childSnap.val(); 
                    var a = x.AllQuestion[0].EventQuestion;
                    var c = x.AllQuestion[0].Options[0].GameAnswer;
                    var d = x.AllQuestion[0].Options[0].odds;
                    var e = x.AllQuestion[0].Options[1].GameAnswer;
                    var f = x.AllQuestion[0].Options[1].odds;
                    var g = x.AllQuestion[0].QuestionId;
    
                    $("#" + id + "_Quest").text(a);
                    $("#" + id + "_optA").text(b);
                    $("#" + id + "_rankA").text(c);
                    $("#" + id + "_optB").text(d);
                    $("#" + id + "_rankB").text(e);
                };
            });
        });
        $scope.$apply();
    });
    

    来自文档:

    监听价值事件

    value 观察者附加到数据列表会将整个数据列表作为单个快照返回,然后您可以循环访问单个子级。

    ref.once('value', function(snapshot) {
      snapshot.forEach(function(childSnapshot) {
        var childKey = childSnapshot.key;
        var childData = childSnapshot.val();
        // ...
      });
    });
    

    有关详细信息,请参阅

    【讨论】:

    • 它工作了兄弟,非常感谢,如果你不介意我可以问你这段代码是如何工作的吗?我对这个带有 angularjs 的实时火力基础技术有点新,希望你的解释:)
    • 添加了对 Firebase 文档的引用。
    猜你喜欢
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2016-01-01
    • 2021-09-26
    • 2020-10-27
    相关资源
    最近更新 更多