1

我正在尝试设计一个网页。我有一个函数,我调用它来获取个人主页所需的所有信息。代码片段是:

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)在我完成设置元素之前就被调用了。

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

4

2 回答 2

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();  
    });
}
于 2013-10-27T22:01:06.650 回答
0

它看起来像dbUtil.findUserClassesByUserId并且dbUtil.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);
      });
  });
}
于 2013-10-27T22:38:27.097 回答