Какой метод более (правильный/читаемый)?

121
21 января 2020, 08:40

Написал несколько строк роутера, потом пришла идея переписать его на async/await, собственно вопрос несколько:

  • Какой подход более правильный или это уже по собственному желанию?
  • Есть ли вообще в данном случае смысл в async/await?
  • Не являются ли плохой практикой вложенные промисы?
  • Не является ли данный код блокирующим? У меня есть подозрение на второй кусок.

На вход идет модель User, точнее её классовые методы. //User.options.classMethods

В качетсве ORM идет Sequelize.

С async/await:

module.exports = function(User) {
  router.post(`/signin`, async function(req, res) {
    const {name, password} = req.body;
    const user = await User.getUser({name});
    if(user == null) {
      let createdUser = await User.createUser({name, password});
      res.status(200).json({createdUser, msg: 'account created succeffully'});
    } else {
      res.status(422).json({"error": `user ${name} exists`});
    }
  });
  return router;
}

Без async/await:

module.exports = function(User) {
  router.post(`/signin`, function(req, res) { 
    const {name, password} = req.body;
    User.getUser({name: name}).then(user => {
      if(user == null){
        User.createUser({name, password})
          .then(user => {
            res.status(200).json({user, msg: 'account created succeffully'});
        });
      } else {
        res.status(422).json({"error":`user ${name} exists`});
      }
    });
  });
  return router;
}
Answer 1

Смысл в async/await есть, т.к. с ним код будет более читаемый. А следовательно и его будет легче поддерживать.

Я бы сказал, что сейчас вложенные промисы это как раз плохая практика. С ними ваш код превращается в promise hell. Почти как callback hell. Лучше всего перейти на async/await.

В плане I/O оба куска неблокирующие, т.к. async/await это обёртка над промисами. А промисы под капотом уже запускаются в отдельной очереди задач. Но нужно не забывать, что некоторые независисмые операции можно объединить через Promise.all().

И ещё нужно не забывать про обработку ошибок. В ноде сейчас необработанные ошибочные промисы не закрывают аварийно процесс. Поэтому нужно установить обработчик unhandledRejection. Также, если вы пишете роутер, то можете использовать готовый middlewaare для async/await обработчиков, async-middleware.

READ ALSO
Отправлятся пустые формы [закрыт]

Отправлятся пустые формы [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском»

142
Чем заменить iframe?

Чем заменить iframe?

Ситуация проста: есть некий html-код, который должен выводиться юзеруНо код этот может генерировать кто угодно, поэтому я использую iframe в режиме...

159
Vue.js вывод сообщения при не найденных данных

Vue.js вывод сообщения при не найденных данных

Вопрос такой, есть цикл при котором мы выводим все что нашли в массиве

112
Наведение курсора на ячейку таблицы JS

Наведение курсора на ячейку таблицы JS

Как при наведении на ячейку таблицы с числами в JS подсветить еще например 3 ячейки, близких по значению к основной? Меня интересует не готовое...

113