Ответ 1
Вы можете использовать функцию Math.random(), чтобы получить случайное число (позвоните ему n). а затем введите n го пользователя:
refUser.orderByChild("online").equalTo(1).on("value", function(Data){
console.log(Data.val(), Data.key);
var totalOnline = Data.numChildren(); //get number of online users
var randomNr = Math.random() * totalOnline;
var userIndex = parseInt(randomNr, 10); //parse the random number from double to integer
var currentIndex = 0;
Data.forEach(function(snap){
if(currentIndex==userIndex){
var randomUser = snap.val();
//Do something with your random user
break;
}
currentIndex++;
});
});
Также обратите внимание, что если у вас есть огромное приложение с тысячами пользователей, вы можете ограничить запрос 50 пользователями, чтобы повысить производительность приложения:
refUser.orderByChild("online").equalTo(1).limitToFirst(50)
Обновить. Чтобы исключить собственного пользователя, вы можете проверить, является ли ваш случайный пользователь. И если это так, перейдите к следующему:
if(currentIndex>=userIndex && snap.key != firebase.auth().currentUser.uid){
var randomUser = snap.val();
//Do something with your random user
break;
}
Обновление 2: Я обнаружил, что вы не можете использовать цикл break
on forEach
. Поэтому вы можете решить это, используя предоставленное решение здесь (используйте BreakException):
refUser.orderByChild("online").equalTo(1).on("value", function(Data){
console.log(Data.val(), Data.key);
var totalOnline = Data.numChildren(); //get number of online users
var randomNr = Math.random() * totalOnline;
var userIndex = parseInt(randomNr, 10); //parse the random number from double to integer
var currentIndex = 0;
var BreakException = {};
try
{
Data.forEach(function(snap){
if(currentIndex==userIndex){
var randomUser = snap.val();
//Do something with your random user
throw BreakException;
}
currentIndex++;
});
}
catch(e){
if(e!== BreakException) throw e;
}
});