На сколько правильно делать вложенность promise?

Добрый день.
На сколько "правильно" писать promise вложенным (пример "утрированный"):
let Redis     = require('ioredis');
let client = new Redis();

client.pop('games:wait')
  .then((token) => {
    client.hgetall('games:wait:' + token)
      .then((gameInfo) => {
        let player1 = gameInfo.player1;
        client.hgetall('account:' + player1)
          .then(('accountInfo') => {
            // ...
          })
          .catch(() => {
            // ...
          });
      })
      .catch(() => {
        // ...
      });
    })
    .catch(() => {
      // ...
    });
  • Вопрос задан
  • 391 просмотр
Решения вопроса 2
bootd
@bootd
Гугли и ты откроешь врата знаний!
client.pop('games:wait')
client.hgetall('games:wait:' + token)
client.hgetall('account:' + player1)

Эти строки уже возвращают Promise, исходя из вашего примера.

Поэтому лучше писать так:
client.pop('games:wait')
  .then((token) => client.hgetall('games:wait:' + token))
  .then(({gameInfo: player1}) => client.hgetall('account:' + player1)
  .then((accountInfo) => console.log(accountInfo))
  .catch((error) => console.error(error));


Такой код выглядит просто и чудесно. Иначе вы пишите стилем "collback hell", вкладывая промисы друг в друга, убивая весь их смысл. Он были как раз придуманы ради того, что бы сделать ваш код в вопросе, таким, который я привёл в примере.
Ответ написан
Комментировать
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
node7+
(async function (){

const token = await client.pop('games:wait');
const {player1} = await client.hgetall('games:wait:' + token);
const accountInfo = await client.hgetall('account:' + player1);

})().catch(e){ console.error(e); }

js async await
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Иногда надо, но вообще обычно достаточно вернуть новый промиз из then и продолжать цепочку как ни в чем ни бывало.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы