【问题标题】:KrakenJS and firebase async not returning valueKrakenJS 和 firebase 异步不返回值
【发布时间】:2016-02-14 19:33:45
【问题描述】:

我正在为我的项目使用 KrakenJS 节点框架,并使用 Firebase 作为数据存储。我想要实现的是,一旦用户登录,它将检索数据 (JSON) 并将其传递给灰尘模板,以便我可以循环并在页面上呈现数据。

但由于 Firebase 是异步的,因此在收集来自 Firebase 的任何数据并将其放入要发送到dustjs模板的 JSON 对象之前,我似乎返回了一个空 JSON。

我的代码示例:

var userBoards = {},
        getBoardDetails = function(boardList) {
        for (var key in boardList) {
            if (boardList.hasOwnProperty(key)) {
                    request(firebasePath+'/boards/'+key+'.json?auth='+token, function (error, response, body) {
                    if (!error && response.statusCode == 200) {
                        userBoards[key] = JSON.parse(body);
                    }
                });
            }
        }
        return userBoards; // Once populated return back JSON object
        },
        getBoardList = function(uid, token) {
            request(firebasePath+'/user-boards/'+uid+'.json?auth='+token, function (error, response, body) {
                if (!error && response.statusCode == 200) {
                    return getBoardDetails(JSON.parse(body)); // Show the HTML for the Modulus homepage.
                }
            });
        };

我的问题是,我该如何返回:

  • 我的模板中的每个单独的值,以便它们单独呈现
  • 将 userBoards 的整个 JSON 返回到我的模板,以便我可以遍历这些值。

【问题讨论】:

  • 你似乎知道为什么不能返回值:它还没有加载。你有什么问题?
  • 哎呀,似乎我错过了实际问题。更新原帖

标签: json node.js firebase kraken.js


【解决方案1】:

正如您已经发现的那样:您现在无法返回仍在加载的内容。

在许多其他编程环境中,您可以让程序等待数据加载,但大多数 JavaScript 环境不是这种情况。

它通常有助于(至少对我而言)重新定义/重新表述问题。与其说“我想加载这个数据,然后用模板渲染它”,不如把它想象成“只要加载了这个数据,我就会用这个模板渲染它”。这不仅可以异步工作,而且如果数据发生变化并且 Firebase 将新值同步到您的应用,它也可以工作。

要实现它们的话,您通常会从以下位置反转流程:

var boards = getBoardList(uid, token);
renderBoards(boards);

进入:

monitorBoardsAnd(uid, token, renderBoards);

在最后一行中,我们将后续操作 (renderBoards()) 传递给异步操作 (monitorBoardsAnd())。以下是实现后者的方法:

    monitorBoardsAnd = function(uid, token, callback) {
        request(firebasePath+'/user-boards/'+uid+'.json?auth='+token, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                callback(JSON.parse(body)); // Show the HTML for the Modulus homepage.
            }
        });
    };

在这个片段中,我删除了加载每个单独板的逻辑。如果您需要这个,您可以保留一个计数器并将另一个回调传递给getBoardDetails() 以增加该计数器,直到您阅读所有这些。但是,我不建议这样做;由于您要为每个板触发 REST 请求,因此性能会很差。

如果您要显示每个用户的版块列表,请考虑在每个用户的列表中包含您显示的详细信息。您将复制数据,但它会避免需要昂贵的连接。

【讨论】:

  • 感谢弗兰克。分离板的主要原因是 1. 板可以与其他用户共享,因此出于安全考虑,我不认为将其放入他们自己的用户详细信息中会起作用。 2. 我认为在用户详细信息中包含所有董事会详细信息可能是一个性能问题,因为当我只想要用户信息而没有董事会信息时,我会返回所有不必要的信息。我做错了吗?
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2020-03-21
  • 1970-01-01
  • 2017-01-14
  • 2017-10-18
  • 2018-01-25
相关资源
最近更新 更多