Как убедиться, что запрос выполнен перед render () на Node JS - PullRequest
0 голосов
/ 17 сентября 2018

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

Моя настройка: Узел JS, Экспресс, Мангуст

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 ().

Спасибо!

1 Ответ

0 голосов
/ 17 сентября 2018

Поскольку обе асинхронные операции возвращают 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
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...