KrakenJS 和 firebase 异步不返回值
KrakenJS and firebase async not returning value
我正在为我的项目使用 KrakenJS 节点框架,并使用 Firebase 作为数据存储。我想要实现的是,一旦用户登录,它将检索数据 (JSON) 并将其传递给 dust 模板,这样我就可以遍历并在页面上呈现数据。
但是由于 Firebase 是异步的,所以在收集来自 Firebase 的任何数据并将其放入要发送的 JSON 对象之前,我似乎正在 return 一个空的 JSON到 dustjs 模板。
我的代码示例:
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.
}
});
};
我的问题是,我如何return:
- 每个单独的值添加到我的模板中,以便它们单独呈现
- return 整个 JSON userBoards 回到我的模板,这样我就可以遍历这些值。
正如您已经发现的那样:您不能 return 现在仍在加载的内容。
在许多其他编程环境中,您可以让程序等待数据加载,但大多数 JavaScript 环境并非如此。
它通常有助于(至少对我而言)reframe/rephrase 问题。将其视为 "whenever this data has loaded, I will render it with this template",而不是 "I want to load this data and then render it with a template"。这不仅可以异步工作,作为额外的好处,如果数据发生变化并且 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 请求,因此性能会很差。
如果您要为每个用户显示看板列表,请考虑在每个用户的列表中包含您显示的详细信息。您将复制数据,但它会避免对昂贵的连接的需要。
我正在为我的项目使用 KrakenJS 节点框架,并使用 Firebase 作为数据存储。我想要实现的是,一旦用户登录,它将检索数据 (JSON) 并将其传递给 dust 模板,这样我就可以遍历并在页面上呈现数据。
但是由于 Firebase 是异步的,所以在收集来自 Firebase 的任何数据并将其放入要发送的 JSON 对象之前,我似乎正在 return 一个空的 JSON到 dustjs 模板。
我的代码示例:
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.
}
});
};
我的问题是,我如何return:
- 每个单独的值添加到我的模板中,以便它们单独呈现
- return 整个 JSON userBoards 回到我的模板,这样我就可以遍历这些值。
正如您已经发现的那样:您不能 return 现在仍在加载的内容。
在许多其他编程环境中,您可以让程序等待数据加载,但大多数 JavaScript 环境并非如此。
它通常有助于(至少对我而言)reframe/rephrase 问题。将其视为 "whenever this data has loaded, I will render it with this template",而不是 "I want to load this data and then render it with a template"。这不仅可以异步工作,作为额外的好处,如果数据发生变化并且 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 请求,因此性能会很差。
如果您要为每个用户显示看板列表,请考虑在每个用户的列表中包含您显示的详细信息。您将复制数据,但它会避免对昂贵的连接的需要。