使用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函数返回值?