Есть ли элегантный способ визуализации двух комплектов документов мангуста? - PullRequest
0 голосов
/ 20 октября 2018

У меня есть вид веб-страницы, для которого требуется два набора документов mongoose, один для «завершенных задач» и один для «незавершенных задач».

Вот мой текущий код:

router.get('/', (req, res) => {
  Task.find({'completed': false}) // Finding all incomplete tasks
    .exec()
    .then((incompleteTasks) => {
      Task.find({'completed': true}) // Finding all complete tasks
        .exec()
        .then((completeTasks) => {
          res.render('tasks/tasks', {
            title: 'Tasks',
            incompleteTasks: incompleteTasks,
            completeTasks: completeTasks,
          });
        });
    });
});

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

Я думал о том, чтобы код имел следующую структуру:

let incompleteTasks = /* Get INCOMPLETE tasks */
let completeTasks = /* Get COMPLETE tasks */
res.render('tasks/tasks', {
  title: 'Tasks',
  incompleteTasks: incompleteTasks,
  completeTasks: completeTasks,
});

Однако из-за асинхронного характера запросов мангуста я не уверен, как это сделать.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Поскольку incompleteTasks и completeTasks не зависят друг от друга, запросы должны выполняться параллельно.

router.get('/', (req, res, next) => {
  Promise.all([
    Task.find({'completed': false}),
    Task.find({'completed': true})
  ]).then(([incompleteTasks, completeTasks]) => {
      res.render('tasks/tasks', {
        title: 'Tasks',
        incompleteTasks: incompleteTasks,
        completeTasks: completeTasks,
      });
    });
  })
  .catch(next);
});

Его можно записать с помощью async..await:

router.get('/', async (req, res, next) => {
  try {
    const [incompleteTasks, completeTasks] = await Promise.all([
      Task.find({'completed': false}),
      Task.find({'completed': true})
    ]);
    res.render('tasks/tasks', {
      title: 'Tasks',
      incompleteTasks: incompleteTasks,
      completeTasks: completeTasks,
    });
  } catch (err) {
    next(err);
  }
});

Поскольку Express не поддерживает обещания, все отклонения должны обрабатываться как правило .

0 голосов
/ 20 октября 2018

Использование асинхронного может быть полезным.

router.get('/', async (req, res) => {
    try{
        incompleteTasks = await Task.find({'completed': false}).exec();
        completeTasks = await Task.find({'completed': true}).exec()
        res.render('tasks/tasks', {
                title: 'Tasks',
                incompleteTasks: incompleteTasks,
                completeTasks: completeTasks,
              });
    }
    catch (e){
        //handle your error here
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...