2016-08-21 1 views
0

Как получить случайные изолированные значения из объекта в NodeJS? Как узнать, выполнялись ли и когда выполнялись запросы? Я имею в виду, не делая это:Извлечение нескольких случайных снимков из одного и того же объекта гигантской базы Firebase

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

Я не могу показаться, чтобы получить рекурсивный код происходит, потому что я новичок в этом и есть так много данных, движущихся вокруг.

+0

'RND (диапазон)' возвращает некоторый случайный ключ, и вы пытаетесь последовательно получить несколько значения? – qxz

+0

@qxz Возвращает 'Math.floor (Math.random() * range)'. Ничего особенного. –

ответ

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)); 
}); 
+0

Я знаю, что последовательные запросы плохи, но я просто пытался проиллюстрировать то, что я пытался выполнить. Ваш код работает красиво! Это также невероятно быстро, и это потрясающе. –

+0

Рад распространить знания. Не забудьте отметить ответ, как принято, как только сможете:) – qxz