我正在为我的项目使用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.
}
});
};
我的问题是,如何返回:
答案 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请求,性能会非常差。
如果您要显示每个用户的电路板列表,请考虑在每个用户的列表中包含您显示的详细信息。您将复制数据,但它可以防止需要昂贵的加入。