Как убедиться, что запрос выполнен перед render () на Node JS

1

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

Моя настройка: узел JS, Express, Mongoose

router.get('/', function (req, res, next) {
var data = {};
Product.find().limit(4).populate({path: 'region_id', model: Region})
    .then(function (doc) {
        data.product = doc;
    });
Type.find()
    .then(function (doc) {
        data.type = doc;
    });

res.render('index', {title: 'Home', items: data});
});

Если я прав, то как убедиться, что вся функция find() выполняется перед запуском render().

Спасибо!

Теги:
express
mongoose
asynchronous

1 ответ

3
Лучший ответ

Поскольку обе асинхронные операции возвращают Promise s, вы должны использовать Promise.all, который будет разрешаться, когда оба завершатся. Нет необходимости в внешнем объекте data, просто используйте значения разрешенных обещаний напрямую. Кроме того, не забудьте обработать ошибки с помощью catch при использовании Promises:

router.get('/', function (req, res, next) {
  Promise.all([
    Product.find().limit(4).populate({path: 'region_id', model: Region}),
    Type.find()
  ])
    .then(([product, type]) => {
      res.render('index', {title: 'Home', items: { product, type } });
    });
    .catch((err) => {
      // handle errors
    });
});
  • 0
    Спасибо вам большое!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню