Как работать с асинхронным кодом в виртуальных свойствах Mongoose?

Я пытаюсь работать с ассоциированием документов в разных коллекциях (не встроенных документов), и хотя для этого в Mongooose есть проблема , я ' m пытается обойти это сейчас, лениво загружая связанный документ с виртуальным свойством, как описано на веб-сайте Mongoose .

Проблема в том, что геттер для виртуального принимает функцию в качестве аргумента и использует возвращаемое значение для виртуального свойства. Это замечательно, когда виртуальный объект не требует никаких асинхронных вызовов для вычисления его значения, но не работает, когда мне нужно выполнить асинхронный вызов для загрузки другого документа. Вот пример кода, с которым я работаю:

TransactionSchema.virtual('notebook')
  .get( function() { // <-- the return value of this function is used as the property value
    Notebook.findById(this.notebookId, function(err, notebook) {
      return notebook; // I can't use this value, since the outer function returns before we get to this code
    })
    // undefined is returned here as the properties value
  });

Это не работает, поскольку функция возвращается до завершения асинхронного вызова. Есть ли способ использовать библиотеку управления потоком для выполнения этой работы, или я могу изменить первую функцию, чтобы передать вызов findById геттеру вместо анонимной функции?

25
задан Mikey P 20 May 2011 в 22:51
поделиться