Задать вопрос
@triggerfinger

Как сделать код более плоским (промисы)?

Учусь писать на промисах, перенес логику Монгуз + Редис на промисы и есть ощущение что я намудрил (хотя все работает без нареканий). Что-то явно лишнее и вложенность убивает саму иде промисов. Как можно переписать этот код более грамотно, что можно убрать?

client.getAsync('data')
    .then((data) => {
      if (data) {
        return res.status(200).json(JSON.parse(data))
      } else {
        let count
        Article.count({})
          .then((c) => {
            count = c
            return count
          })
          .then(() => {
            Article
              .find({}, '-_id title content slug')
              .sort({_id: -1})
              .limit(limit)
              .skip((page - 1) * limit)
              .then((articles) => {
                let redisData = {
                  count,
                  articles
                }
                client.set('data', JSON.stringify(redisData), 'EX', 20, function (error) {
                  if (error) { throw error }
                })
                return res.status(200).json({
                  count,
                  articles
                })
              })
              .catch((err) => {
                return next(err)
              })
          })
      }
    })
    .catch((err) => {
      return next(err)
    })


(Тостеру надо срочно менять эту подсветку кода, это же ужас просто!)
  • Вопрос задан
  • 303 просмотра
Подписаться 2 Простой 4 комментария
Решения вопроса 2
client.getAsync('data')
	.then((data) => {
		if (data)
			return [data.count, data.articles, true];

		return [Article.count({}),
			Article.find({}, '-_id title content slug')
				.sort({_id: -1})
				.limit(limit)
				.skip((page - 1) * limit),
			false]
	})
	.spread((count, articles, fromCache) => {
		if (!fromCache) {
			return new Promise((resolve, reject) => {
				client.set('data', JSON.stringify({count, articles}), "EX", 20, (error) => {
					if (error)
						return reject(error);

					return resolve([count, articles]);
				});
			});
		}

		return [count, articles];
	})
	.spread((count, articles) => {
		return res.status(200)
			.json({
				count,
				articles
			})
	})
	.catch((err) => {
		return next(err);
	});


Тоже не очень, нужно разделение кода, вынести в репозитории, которые будут управлять кешем и тогда код в контроллерах будет красивше, ну и саму запись в кеш изначально сделать на промисах, тогда можно будет придумать что-то еще. spread из bluebird
Ответ написан
@qwead
if (data) {
        return res.status(200).json(JSON.parse(data))
      } else {
...
}

Блок else можно опустить -- выигрыш в 1 уровень вложенности
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы