如何在回调之前设置变量?

时间:2013-10-27 21:51:05

标签: node.js asynchronous

我正在尝试设计一个网页。我有一个功能,我打电话来获取个人主页所需的所有信息。代码片段是:

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)

我已经看到人们使用异步库来解决这个问题,但我想知道是否还有其他方法可以让我在不需要更多模块的情况下完成它。

2 个答案:

答案 0 :(得分:1)

一种可能的方法:

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();  
    });
}

答案 1 :(得分:0)

看起来dbUtil.findUserClassesByUserIddbUtil.findNameByUserId是异步方法;这通常表示他们返回一个值,而是使用回调来为您提供数据。

这两个函数很可能期望签名如下:

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);
      });
  });
}