从同一个巨型Firebase数据库对象中检索一些随机快照

时间:2016-08-21 21:04:01

标签: node.js firebase firebase-realtime-database database nosql

如何从NodeJS中的对象获取随机隔离值?我如何知道请求是否以及何时满足?我的意思是不这样做:

http.createServer(function(request, response) {
    var obj = [];
    ref("games").child(rnd(range)).once("value").then(function(snapshot) {
        obj.push(snapshot.val());
    }).then(function() {
        ref("games").child(rnd(range)).once("value").then(function(snapshot) {
            obj.push(snapshot.val());
        }).then(function() {
            ref("games").child(rnd(range)).once("value").then(function(snapshot) {
                obj.push(snapshot.val());
            }).then(function() {
                ref("games").child(rnd(range)).once("value").then(function(snapshot) {
                    obj.push(snapshot.val());
                }).then(function() {
                    ref("games").child(rnd(range)).once("value").then(function(snapshot) {
                        obj.push(snapshot.val());
                    }).then(function() {
                        ref("games").child(rnd(range)).once("value").then(function(snapshot) {
                            obj.push(snapshot.val());
                        }).then(function() {
                            response.end(JSON.stringify(obj));
                        });
                    });
                });
            });
        });
    });
}).listen(8081);

我似乎无法获得递归代码,因为我对此很新,并且有太多数据在移动。

1 个答案:

答案 0 :(得分:1)

按顺序执行每个请求可能不是最好的方法;在开始下一个之前没有理由等待最后一个完成。当然,诀窍是知道最后一个请求何时完成。我通常只是使用一个计数器:

function getSomeStuff(numToGet, callback) {
  var obj = []; // accumulates the results
  var numDone = 0; // keeps track of how many of the requests have completed
  for (var n=0; n<numToGet; n++) {
    ref("games").child(rnd(range)).once("value", function(snapshot) {
      // NOTE: inside this function, n will always ==numToGet!
      obj.push(snapshot.val());
      if (++numDone == numToGet) { // if this is the last request to complete,
        callback(obj); // call the callback with the results
      }
    });
  }
}

然后在http处理程序中,只需:

getSomeStuff(6, function(obj) {
  response.end(JSON.stringify(obj));
});