javascript – 与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下面的代码移到其回调中. 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?

点赞