【问题标题】:Modifying variable within firebase function在firebase函数中修改变量
【发布时间】:2017-08-17 18:15:24
【问题描述】:

每当我的程序尝试修改firebase function 中的exists 时,获得的值都是临时的。我希望能够在此function 的末尾@ 987654323@ 或false。我看过一些相关的帖子,但似乎没有任何效果。制作exists global 并分离snapshot function 不起作用。有什么建议吗?

function checkIfUserExists(userId) {
    var exists;
    var usersRef = firebase.database().ref("users");
    usersRef.child(userId).once('value').then(function(snapshot) {
        exists = (snapshot.val() !== null); // exists is true or false
        userExistsCallback(userId, exists);
    });
    return exists; //exists is undefined
}

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    由于once 返回了一个promise,而then 返回了一个新的promise,所以你不能只返回exists,因为给它赋值的块会在后面发生。

    但是,您可以返回承诺,并在调用站点中使用 then

    function checkIfUserExists(userId) {
        var exists;
        var usersRef = firebase.database().ref("users");
        return usersRef.child(userId).once('value').then(function(snapshot) {
            exists = (snapshot.val() !== null); // exists is true or false
            return exists;
        });
    }
    

    然后在调用站点:

    checkIfUserExists(userId).then(exists => /*do something*/)
    

    【讨论】:

    • 好的,我在 while 循环中使用它,所以在所有站点上我会写什么? checkIfUserExists(userId).then(exists => //如何返回真假)
    • 如果你在循环中使用它,你会有很多承诺。您可以使用Promise.all 等待它们全部完成,并获取结果集合。
    【解决方案2】:

    在这种情况下,由于范围的原因,您不能返回存在。 function(snapshot) 之后括号内的所有内容都是回调,这意味着您的函数将此查询设置到数据库,并在 Firebase 返回您的数据后运行括号中的代码。同时,它将继续执行您的其余功能。所以在 return 之前没有给 exists 一个值。

    您可能想要更全球化的东西。你可以让exists成为一个全局变量,让这个函数什么都不返回,然后检查exists的值。如果您必须为多个用户执行此操作,您可以将其放入字典类型的结构中。

    【讨论】:

      猜你喜欢
      • 2016-11-23
      • 1970-01-01
      • 2012-01-15
      • 2015-11-11
      • 1970-01-01
      • 2022-10-04
      • 2017-01-06
      • 1970-01-01
      相关资源
      最近更新 更多