Javascript Firebase:如何加载顶级帖子而不跳过得分相似的帖子?

Javascript Firebase:如何加载顶级帖子而不跳过得分相似的帖子?,javascript,node.js,firebase,firebase-realtime-database,Javascript,Node.js,Firebase,Firebase Realtime Database,我使用firebase在我的web应用程序中实现了无限滚动 在我的“顶部”部分,我展示了用户投票率最高的帖子 问题是,在我当前的实现中,跳过了一些帖子 也就是说,如果许多帖子都有相同的分数,有些帖子就不会出现 我理解为什么会发生这种情况,我按12个批次加载我的帖子,然后通过这样做选择下一个批次: start = childDataSnapshot.child("inversedScore").val() + 1; 这种方法的问题是,如果有超过12个元素具有相同的投票分数,或者如果有两个元素具有

我使用firebase在我的web应用程序中实现了无限滚动

在我的“顶部”部分,我展示了用户投票率最高的帖子

问题是,在我当前的实现中,跳过了一些帖子

也就是说,如果许多帖子都有相同的分数,有些帖子就不会出现

我理解为什么会发生这种情况,我按12个批次加载我的帖子,然后通过这样做选择下一个批次:

start = childDataSnapshot.child("inversedScore").val() + 1;
这种方法的问题是,如果有超过12个元素具有相同的投票分数,或者如果有两个元素具有相同的投票分数,一个是12号,另一个是13号,那么13号被忽略,我们直接进入下一个分数级别

例如,以下是我在服务器上的数据:

post1: score: 15
post2: score: 14
post3: score: 13
post4: score: 12
post5: score: 11
post6: score: 10
post7: score: 10
post8: score: 9
post9: score: 9
post10: score: 9
post11: score: 8
post12: score: 7

//posts 13 and 14 will be ignored
post13: score: 7
post14: score: 7

post15: score: 6
post16: score: 6
以下是我将在客户机上看到的内容:

post1: score: 15
post2: score: 14
post3: score: 13
post4: score: 12
post5: score: 11
post6: score: 10
post7: score: 10
post8: score: 9
post9: score: 9
post10: score: 9
post11: score: 8
post12: score: 7
post15: score: 6
post16: score: 6
还有什么其他方法可以使用firebase加载顶级帖子,从而永远不会“跳过”得分相同的顶级帖子


客户端:

var started = false;

app.controller('ctrl', function ($scope, $firebaseArray, $timeout) {

    if(started == false) {
        started = true;

        $scope.bricks = [];
        var _n = 12;

        if ( $(window).width() < 992) {
          _n = 2;
        } 

        var firstElementsLoaded = false;
        var _start = -1000000000;
        var position = 0;

        $scope.getDataset = function() {  
            var sendObject = {
                start: _start,
                section: section,
                n: _n,
            } 
            $.ajax({
                type: "POST",
                url: "images/top",
                data: sendObject,
            }).done(function(result) {
                for (var i = 0; i < result.array.length; i++) {
                    console.log("result: "+result.array[i]);
                    $scope.bricks.push(result.array[i]);
                    $scope.$apply();
                }

                _start = result.start;
                firstElementsLoaded = true;
            });
        };


        $scope.getDataset();

        var screenHeight;
        var existingScreenHeight

        if ( $(window).width() < 992) {
            screenHeight = (_n + 1) * 350;
            existingScreenHeight = -350;
        } 
        else {
            screenHeight = 1 * Math.ceil($(window).height()); 
            existingScreenHeight = -screenHeight;
        }

        window.addEventListener('scroll', function() {

            if (firstElementsLoaded == true) {
               if (window.scrollY >= ((screenHeight) + existingScreenHeight)) {
                  existingScreenHeight += (screenHeight);
                  $scope.$apply($scope.getDataset());
                  firstElementsLoaded = false;
               }
            }
        });
    }
});

angular.bootstrap(document.body, ['app']);
router.post('/images/top', function(req, res, next) {
    var start = parseInt(req.body.start);
    var section = req.body.section;
    var n = parseInt(req.body.n);
    var returnArray = [];
    var screenshotRef = admin.database().ref("posts/"+section);
    screenshotRef.orderByChild("inversedScore").startAt(start).limitToFirst(n).once("value", function(dataSnapshot) {

        dataSnapshot.forEach(function(childDataSnapshot) {

            start = childDataSnapshot.child("inversedScore").val() + 1;

            var post = childDataSnapshot.val();

            var file = bucket.file(post.image);

            var config = {
              action: 'read',
              expires: Date.now() + global.expiryTime,
            };

            file.getSignedUrl(config, function(err, url) {
                if (err) {
                    console.error(err);
                    return;
                }
                post.image = url;
                returnArray.push(post);
                if (returnArray.length == n) {
                    var returnObject = {
                        start: start,
                        array: returnArray
                    }
                    res.send(returnObject);
                }
            });
        });  
    });
});

您可以轻松跳过客户端中的额外项(通常称为锚定项)。您不能在查询中跳过它。如果将锚定项的键作为第二个参数传入,则可以确保只有一个重叠项

请参见前面的问题:


如果您对此有任何疑问,请告诉我,因为这绝对不是API中最直观的部分。

您可以轻松跳过客户端中的额外项目(通常称为锚定项目)。您不能在查询中跳过它。如果将锚定项的键作为第二个参数传入,则可以确保只有一个重叠项

请参见前面的问题:

如果您对此有任何疑问,请告诉我,因为它绝对不是API中最直观的部分