Я нашел 2 способа сделать это. Первый из них полезен, если у нас есть DataSnapshot без какого-либо вызова OrderBy *, в этом случае:
var allServers = await serversRef.once("value");
for (let serverKey of Object.keys(allServers.val())){
var server = allServers[serverKey];
//Do some work
}
Сначала нужно получить ключи объекта, чтобы затем можно было извлечь его из в пределах для l oop, как объяснено здесь в противном случае мы получим "Ошибка типа: 'x' не повторяется"
Теперь проблема в этом конкретном случае состоит в том, что DataSnapshot, который ранее был отсортирован в var serversSorted = serversRef.orderByChild('lastTimeUsed')
, поэтому, когда мы вызываем Object.keys(allServers.val())
, возвращаемое значение больше не сортируется, и здесь forEach () оказывается полезным. Это гарантирует, что потомки DataSnapshot будут повторяться в порядке их запросов, как объяснено здесь , однако по некоторым причинам при выполнении некоторой асинхронной c работы в forEach l oop это, похоже, не работает, это Вот почему я должен был сделать это:
var serversSorted = serversRef.orderByChild('lastTimeUsed')
var allServers = await serversSorted.once("value");
//Checks if there is any children
if (allServers.hasChildren()) {
//if there is iterate through the event that was passed in containing all
// the servers
var alreadyOnCall = false;
var arrayOfServers = []
var arrayOfKeys = []
allServers.forEach(function(individualServer){
arrayOfKeys.push(individualServer.key)
arrayOfServers.push(individualServer)
})
for (var serveIndex = 0; serveIndex < arrayOfServers.length;serveIndex++){
var serverObj = arrayOfServers[serveIndex]
var serverObject = serverObj.val()
var serverKey = arrayOfKeys[serveIndex]
var serverStatus = serverObject["serverStatus"];
var serverNumber = serverObject["serverNumber"];
console.log("server info "+serverStatus+" "+serverKey);
if (serverStatus === waiting && alreadyOnCall === false) {
const setCallRequest = await serversRef.child(serverKey).child("current").child("callRequest").set(callRequest);
const removeUserOnCall = await rootPath.child("resquests").child(userOnCall).remove();
const setServerStatus = await serversRef.child(serverKey).child("serverStatus").set("onCall");
alreadyOnCall= true
console.log("Call properly set");
}
}
}