2013-10-27 2 views
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) вызывается прежде, чем я даже закончить установку элементов.

Я видел, что люди используют асинхронную библиотеку для решения этой проблемы, но мне было интересно, не было ли у меня другого способа сделать это, не требуя больше модулей.

+1

Что 'findNameByUserId' и' findUserClassesByUserId' вернуться? С первого взгляда они выглядят как асинхронные функции, нет? – raina77ow

ответ

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(); 
    }); 
} 
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); 
     }); 
    }); 
} 
Смежные вопросы