我是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为null,而不是因为Firebase实际上为null,该值正确地显示为console.log(gameID)为43,因为它似乎第一个Firebase调用尚未完成第二次Firebase通话,达到更新分数?
我该如何解决?
最佳答案 将gameScoreRef.child下面的代码移到其回调中. gameScoreRef.child是一个异步函数,当你在gamesRef.child(gameID)中使用它时,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
});
检查这个问题:
> How do I return the response from an asynchronous call?
> How to return value from an asynchronous callback function?