我是Firebase和Node.js的新手,但我要做的是以下内容:
gameScoreRef.child(score["ss"][i][10]).once('value', function(snapshot) {
if (!snapshot.val()) {
// NULL
} else {
gameID = snapshot.val();
console.log(gameID);
}
});
var ref = gamesRef.child(gameID);
ref.update({
aScore: parseInt(score["ss"][i][5]),
hScore: parseInt(score["ss"][i][7])
});
所以基本上我正在进行一次Firebase调用以获取GameScore Ref,一旦检索到它,这将完美地运行,它将使用该GameID来更新游戏分数。
引发的错误是gameID
为空,而不是因为Firebase实际上为空,该值正确显示,console.log(gameID)
为43,因为它似乎是第一个Firebase第二次Firebase通话前呼叫尚未完成,是否达到了更新分数?
我该如何解决?
答案 0 :(得分:1)
将gameScoreRef.child
内的代码移到其回调中。 gameScoreRef.child
是一个异步函数,gameID
中使用它时gamesRef.child(gameID)
不存在。
gameScoreRef.child(score["ss"][i][10]).once('value', function(snapshot) {
if (!snapshot.val()) {
// NULL
} else {
gameID = snapshot.val();
console.log(gameID);
var ref = gamesRef.child(gameID);
ref.update({
aScore: parseInt(score["ss"][i][5]),
hScore: parseInt(score["ss"][i][7])
});
}
});
// "gameID" doesn't exist here!
或者您可以创建一个返回promise的retrieveScore
函数。
function retrieveScore(ref){
return new Promise((resolve, reject) => {
gameScoreRef.child(ref).once('value', snapshot => {
if (!snapshot.val()) {
return reject();
resolve(snapshot.val());
});
});
}
retrieveScore(score["ss"][i][10]).then(gameID => {
console.log(gameID);
let ref = gamesRef.child(gameID);
ref.update({
aScore: parseInt(score["ss"][i][5]),
hScore: parseInt(score["ss"][i][7])
});
}).catch(err => {
//Handle error
});
检查这个问题: