【问题标题】:Race condition with Node.js and FirebaseNode.js 和 Firebase 的竞争条件
【发布时间】:2017-09-17 10:03:27
【问题描述】:

我是 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 调用之前,是否已达到更新分数?

我将如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    gameScoreRef.child 下面的代码移到它的回调中。 gameScoreRef.child是一个异步函数,gameIDgamesRef.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
    });
    

    检查以下问题:

    【讨论】:

    • 案例 1:这会导致调用时 gameID 为空的相同问题。
    • @learningiOS 检查我编辑的答案,gamesRef.child(gameID)else 块内,console.log 是否打印正确?
    • 您能在catch 中添加一个console.log 并告诉我那里是否打印了任何内容吗?
    • 我无法测试您的代码,但如果 gameScoreRef.child 像您在代码示例中输入的那样工作,那么我的代码应该可以工作。
    • 我按照你没有完成 if else 配对的更正方式对它进行了编码;但它仍然不起作用。在 retrieveScore 函数中,gameScoreRef.child(ref).once(... 永远不会被调用!?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2020-07-12
    • 2011-10-02
    • 2019-02-23
    • 2019-11-25
    • 2017-01-23
    • 1970-01-01
    相关资源
    最近更新 更多