Node.js和Firebase的竞争条件

时间:2017-04-20 16:35:00

标签: javascript node.js firebase firebase-realtime-database

我是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通话前呼叫尚未完成,是否达到了更新分数?

我该如何解决?

1 个答案:

答案 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!

或者您可以创建一个返回promiseretrieveScore函数。

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
});

检查这个问题: