【发布时间】:2020-04-04 23:56:40
【问题描述】:
我正在尝试遍历 DataSnapshot 的内容,然后根据条件为每个元素做一些工作,但目前,ForEach 只在第一项中工作。 “serverStatus”有时正在等待,有时在“onCall”中。当第一个项目是“onCall”时,不会像我认为应该做的那样遍历其余项目。下面是我从哪里获取信息的快照:
这是我的功能:
exports.manageCallRequests = functions.database.ref('/resquests/{userId}').onCreate((snap, context) => {
const event = snap.val();
console.log("function manageCallRequests is being called")
var rootPath = admin.database().ref();
var userOnCall = context.params.userId;
var serversRef = rootPath.child('servers');
var callRequest = event;
var userTime = callRequest["time"];
var waiting= "waiting";
//We first get all the servers in ascending order depending on the last time they were used
var serversSorted = serversRef.orderByChild('lastTimeUsed')
//Gets the children on the "serversSorted" Query
return serversSorted.once("value").then(allServers =>{
//Checks if there is any child
if(allServers.hasChildren()){
allServers.forEach(async function(server) {
//we extract the value from the server variable, this contains all the information
//about each one of the servers we have
var serverInfo = server.val();
var serverKey = server.key;
var serverNumber = serverInfo["serverNumber"];
var serverStatus = serverInfo["serverStatus"];
console.log("server status "+serverStatus)
if(serverStatus === waiting){
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");
}
});
}else{
console.log("No servers available")
}
});
});
【问题讨论】:
-
您如何观察这种行为?你在记录什么吗?你能显示它的输出并将其与你的期望进行比较吗?
-
很可能与 Promises 无关,更可能的是
serverStatus === waiting除了第一次迭代之外的所有内容都为 false -
这就引出了一个问题:上面代码中
waiting的值是多少?它是如何在 Cloud Functions 中调用的?我们在这里遗漏了一些必要的信息,这些信息对于提供帮助是必要的。另见how to create a minimal, complete, verifiable example。 -
我已经编辑了我的问题。即使 serverStatus === waiting 为 true,该函数也具有相同的行为
标签: javascript node.js firebase-realtime-database google-cloud-functions