如何在callback之前设置variables?
我正在devise一个网页。 我有一个函数,我打电话来获取个人主页所需的所有信息。 代码片段是:
exports.getHomePageData = function(userId, cb) { var pageData = {}; pageData.userFullName = dbUtil.findNameByUserId(userId, function(err){ if (err) cb(err); }); pageData.classes = dbUtil.findUserClassesByUserId(userId, function(err){ if (err) cb(err); }); cb(pageData); }
我遇到的问题是,我甚至完成设置元素之前调用cb(pageData)
。
我已经看到人们使用asynchronous库来解决这个问题,但是我想知道是否有其他的方法可以让我做到这一点,而不需要更多的模块。
一种可能的方法:
exports.getHomePageData = function(userId, cb) { var pageData = {}, filler = function() { if ('userFullName' in pageData && 'classes' in pageData) cb(null, pageData); }; dbUtil.findNameByUserId(userId, function(err, name) { if (err) { cb(err); return; } pageData.userFullName = name; filler(); }); dbUtil.findUserClassesByUserId(userId, function(err, classes) { if (err) { cb(err); return; } pageData.classes = classes; filler(); }); }
它看起来像dbUtil.findUserClassesByUserId
和dbUtil.findNameByUserId
是asynchronous方法; 这通常表示他们不返回一个值,而是使用callback给你的数据。
这两个函数最有可能期待签名如下:
function(err, data) { // if err is set, an error occurred, otherwise data is set with the result }
因此,你的函数应该看起来像这样:
exports.getHomePageData = function(userId, cb) { dbUtil.findNameByUserId(userId, function(err, userFullName){ if (err) { cb(err); return; } dbUtil.findUserClassesByUserId(userId, function(err, classes){ if (err) { cb(err); return; } var pageData = { userFullName: userFullName, classes: classes }; cb(pageData); }); }); }
- 节点:async.foreach失败时,错误未捕获exception被抛出
- Node.jsasynchronous用例
- Apidevise为一个不安全的asynchronous函数
- Javascript – asynchronous等待vs承诺callback
- 在节点中如何声明全局variables只能用于当前的执行上下文,在asynchronouscallback中不需要?
- 当写入数据库的并发API调用发生时(或者当服务器速度较慢时)阻止争用条件
- 在Grunt中显示输出为命令运行?
- NodeJS / Waterline,在响应之前需要等待多个创build结束
- nodejs中多个asynchronousmongo请求