node.js: как дождаться выполнения предыдущей функции.

Извиняюсь заранее за тупой вопрос.

есть такой участок кода

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .javascript.geshi_code {font-family:monospace;} .javascript.geshi_code .imp {font-weight: bold; color: red;} .javascript.geshi_code .kw1 {color: #000066; font-weight: bold;} .javascript.geshi_code .kw2 {color: #003366; font-weight: bold;} .javascript.geshi_code .kw3 {color: #000066;} .javascript.geshi_code .co1 {color: #006600; font-style: italic;} .javascript.geshi_code .co2 {color: #009966; font-style: italic;} .javascript.geshi_code .coMULTI {color: #006600; font-style: italic;} .javascript.geshi_code .es0 {color: #000099; font-weight: bold;} .javascript.geshi_code .br0 {color: #009900;} .javascript.geshi_code .sy0 {color: #339933;} .javascript.geshi_code .st0 {color: #3366CC;} .javascript.geshi_code .nu0 {color: #CC0000;} .javascript.geshi_code .me1 {color: #660066;} .javascript.geshi_code span.xtra { display:block; }
schema.virtual('city')
    .get(function() {
        City.findOne({city_id: this.city_id}, function(err, city) {
            log.info(city.name);
            return city.name;
        });
    });


по запросу user.city выводится пустое поле, как исправить данную недоработку.
заранее спасибо за ответ.

1 ответов


1. this может являться не тем чем кажется, можно попробовать замыкание.
2. return city.name; куда вы хотите это вернуть? Нужно использовать callback

var onCityFinded = function(city)
{
  console.lnfo(city.name);
};

schema.virtual('city')
    .get(
// создаем функию и сразу вызываем ее передав ей контекст this
(function(self){
  // вернем функцию
  return function() {
        // делаем то что нужно, вторым параметром передается функция, она вызовется не сразу, поэтому нужно остальные действия вынести в отдельную функцию, чтобы не потерять контекст this передадим его при вызове колбек функции
        City.findOne({city_id: self.city_id}, function(err, city) {
            onCityFinded.call(self,city);
            //log.info(city.name);
            // return city.name;
     });
 }
})(this)
);

// ------------

(function(self){
  return function() {
    // покажите что выведет эта функция
    console.log("citi_id: ", self.city_id);
    City.findOne({city_id: self.city_id}, function(err, city) {
      // и эта
      console.log(err,city);
      onCityFinded.call(self,city);
    });
  }
})(this);

var onCityFinded = function(city)
{
    // вот это делать бесполезно, Вы видимо не понимаете как работает калбек функция, она не вернет Вам результат прямо сейчас, она просто выполнится, эта функция не должна ничего возвращать, она должна выполнить действия с результатом выполнения функции findOne
    return city.name;
};