如何在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.findUserClassesByUserIddbUtil.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); }); }); }