KrakenJS和firebase异步不返回值

时间:2015-11-13 09:01:21

标签: json node.js firebase kraken.js

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

但是,由于Firebase是Async,我似乎在收集Firebase的任何数据并将其放入JSON对象以发送到dustjs模板之前返回一个空的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返回给我的模板,以便循环显示值。

1 个答案:

答案 0 :(得分: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请求,性能会非常差。

如果您要显示每个用户的电路板列表,请考虑在每个用户的列表中包含您显示的详细信息。您将复制数据,但它可以防止需要昂贵的加入。