使用Node.js和Firebase竞争条件
我是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
下面的callback中。 gameScoreRef.child
是一个asynchronous函数,在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 });
检查这个问题:
- 如何返回来自asynchronous调用的响应?
- 如何从asynchronouscallback函数返回值?