Есть элегантный способ сделать два комплекта Мангуста документов?

голоса
0

У меня есть мнение на веб-страницу, которая требует двух наборов 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,
});

Однако, из-за асинхронной природы Mongoose запросов, я не знаю, как это сделать.

Какие-либо предложения?

Задан 20/10/2018 в 04:54
источник пользователем
На других языках...                            


2 ответов

голоса
0

Так как 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);
  }
});

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

Ответил 20/10/2018 в 06:40
источник пользователем

голоса
0

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

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
    }
});
Ответил 20/10/2018 в 05:56
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more