如何在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); }); }); }
- 如果超过一定的限制时间,如何在Node.js中完成一个操作?
- 保存asynchronousfunction的结果供以后使用
- 无法find一个简单的方法出了多个asynchronous的每个节点js(帆)
- 如何在Node.js中完成所有Web抓取请求后才呈现页面?
- 在nodejs(asynchronous)循环和callback中寻找适当的模式
- 如何在node.js + Express.js + mongodb应用程序上asynchronous启动摩卡testing
- async.series函数没有完成
- 使用嵌套的async.forEachSeries和async.waterfall来控制Lambda Node.js代码的sorting
- 将数据注入asynchronouscallback(使用node.js)