【问题标题】:Return a value from a Firebase JS callback method (DAL) to another function (controller)将值从 Firebase JS 回调方法 (DAL) 返回到另一个函数(控制器)
【发布时间】:2016-04-11 21:41:18
【问题描述】:

我一直在开发一个简单的聊天应用程序,它允许用户在简单的群聊中键入消息并让它们实时更新/显示。正因为如此,我决定使用 Firebase,并花了一些时间来适应它的 Web API。但是,当我尝试手动创建一个简单的用户身份验证系统,甚至只是将值列表返回给另一个函数时,我遇到了一些问题。

我正在尝试遵循 MVC 模式,HTML 表单在 global.js 内触发事件处理程序,然后调用控制器文件中的适当方法,进而调用 DAL 中的适当方法。 DAL 转到远程 Firebase 并执行请求的操作。

我的问题是在once 事件处理程序触发后我没有发生任何事情。控制器将执行checkUserLogin() 方法,但不会将任何内容分配给变量loginValid。据我从调试中得知,执行到达事件处理程序的末尾,然后自行退出。我读过一些关于异步 JS 的东西,但不是很了解。

我想要做的就是从 Firebase 检索一个列表,在将结果从 DAL 传递到控制器之前对其进行处理以进行身份​​验证,然后在控制器中处理结果。出于这些目的,我并不关心实时更新,我只是有时想返回 Firebase 列表中数据的当前快照,并在另一个函数中对其执行操作。

这是我的文件结构(根据需要)。 global.js 包含事件处理程序,负责处理 HTML 页面事件并选择适当的控制器操作 (security_controller.js),然后调用必要的 DAL 操作 (security_dal.js)。

global.js

$(document).ready(function() {
    $("#btnSubmitLogin").on("click", btnSubmitLogin_click);
});

function btnSubmitLogin_click() {
     doUserLogin();
}

security_controller.js

function doUserLogin() {
    var username = $("#txtLoginUsername").val();
    var password = $("#txtLoginPassword").val();

    //Determine if user is logged in, and react accordingly
    var loginValid = checkUserLogin(username, password);

    if (loginValid) {
        navigateToPage("pageHome");
        $("#successMessageLogin").text("Success validating user");
    }
    else {
        navigateToPage("pageLogin");
        $("#errorMessageLogin").text("Error validating user");
    }
}

security_dal.js

function checkUserLogin(username, password) {
    var foundUser = null;
    var loginValid = false;

    fb_ref.once("value", function(snapshot) {
        var list = snapshot.val();

        for (var i in list) {
            if (list[i].username === username && list[i].password === password) {
                foundUser = list[i];
                break;
            }
        }           

        return loginValid;
    });

    if (foundUser !== null) {
        console.info(foundUser.username);
        console.info(foundUser.password);
        loginValid = true;
    }

    return loginValid;
}

我检查了几个类似的搜索,但没有找到任何答案。在以下问题/答案中,答案提到了有关异步 javascript 的内容,并且似乎仅通过将检索到回调函数中的值后需要执行的代码来解决该问题。然而,这与我试图通过我的“MVC 模式”实现的目标背道而驰。 DAL 不应该接触视图,而是将返回的值传递回控制器。

Firebase Query Inside Function Returns Null

理想情况下,这是我想要发生的事情:

  • global.js 致电btnSubmitLogin_click()
  • btnSubmitLogin_click() 在控制器中调用doUserLogin
  • 控制器中的 doUserLogin 调用 DAL 中的 checkUserLogin
  • DAL 中的 checkUserLogin 从 Firebase 检索用户列表并查找与输入的凭据匹配
  • DAL 中的checkUserLogin 向控制器返回真/假,并将其分配给变量loginValid
  • 控制器决定如何处理这些信息,并根据需要更新视图

注意:我完全知道 Firebase 有自己的身份验证,但我想创建自己的简单版本只是为了我猜的体验。因此,我只需要一个数据列表/数组即可在控制器中进行操作。我也知道过滤/排序的可能性,但是我希望使用这种方法来检查用户,因为我想知道如何检索列表。

如果我完全以错误的方式执行此操作(Firebase 的新手),或者是否应该提供其他内容,请告诉我。谢谢!

【问题讨论】:

    标签: javascript jquery asynchronous model-view-controller firebase


    【解决方案1】:

    是的,异步是这里的关键。通常,您可以通过自己的回调来解决这个问题。这样,您仍然可以在正确的位置执行逻辑。

    在这种情况下,您可以为checkUserLogin 创建第三个参数:

    checkUserLogin(username, password, function(foundUser) {
    
         if (foundUser) {
             navigateToPage("pageHome");
             $("#successMessageLogin").text("Success validating user");
         } else {
            navigateToPage("pageLogin");
            $("#errorMessageLogin").text("Error validating user");
         }
    });
    

    然后:

    function checkUserLogin(username, password, callback) {
        fb_ref.once("value", function(snapshot) {
            var list = snapshot.val();
            var foundUser;
    
            for (var i in list) {
                if (list[i].username === username && list[i].password === password) {
                    foundUser = list[i];
                    break;
                }
            }           
            callback(foundUser)
        });
    }
    

    (必须指出未加密的密码等)

    【讨论】:

    • 啊,谢谢。我相信这有点道理,我会试一试。我想我仍然不太了解回调或函数传递(或类似的东西??)。是的,我完全知道未加密的密码,这完全是非生产的。但我很欣赏这个警告:)
    • 函数可以像任何变量一样使用。这意味着您可以将一个函数用作另一个函数的参数,就像一个函数可以返回一个函数一样。您已经在使用它们,请参阅第二个 fb_ref.once 输入参数。
    • 我明白了,无论如何在理论上。但是,当我把头缠在它周围时,我总是很挣扎。不过,我将来肯定会更多地研究它。我正在完成第二年的编程,但不幸的是,他们只看过基本的 JS,而我一直一个人呆着。这肯定会帮助我理解更多,我希望!
    猜你喜欢
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多