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

Правильно ли я выстроил Promise?

Здравствуйте, подошел к изучению Promise, подскажите пожалуйста правильно ли я выстроил Promise и можно ли его записать как-нибудь короче? Может быть можно не возвращать каждый раз new Promise?
Код:
console.log('Запрос данных...');

const req = new Promise((resolve, reject) => {

    setTimeout(() => {
        console.log('Подготовка данных...');

        const data = {
            name: 'Personal computer',
            model: 'MSI',
            price: 120000,
            weightKG: 10,
        };

        resolve(data);
    }, 2000);
}).then((data) => {
    return new Promise ((resolve, reject) => {

        setTimeout(() => {
            console.log('Обработка данных...');
            data.status = 'order';
            data.discount = '20%';
            data.price -= 120000 * parseInt(data.discount, 10) / 100;

            resolve(data);
        }, 2000);
    });
}).then((data) => {
    return new Promise((resolve, reject) => {

        setTimeout(() => {
            console.log('Выписка чека...');
            data.check = `№${Math.floor(Math.random() * 100000000)}`;

            resolve(data);
        }, 2000);
    });
}).then((data) => {
    return new Promise((resolve, reject) => {

        setTimeout(() => {
            console.log(`Данные получены:\n1.Наименование: ${data.name}\n2.Модель: ${data.model}\n3.Цена: ${data.price}\n4.Вес: ${data.weightKG}\n5.Статус: ${data.status}\n6.Скидка: ${data.discount}\n7.Чек: ${data.check}\n`);
            resolve();
        }, 2000);
    });
}).then(() => {
    setTimeout(() => {
        console.log('...:::С новым годом!:::...');
    }, 2000);
});
  • Вопрос задан
  • 315 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Aetae
@Aetae Куратор тега JavaScript
Тлен
Технически правильно, но база программирования - вынесение повторяющихся действий в функции, условно как-то так:
function wait(delay) {
  let promise;
  const fn = function(result) {
    return promise || (promise = new Promise(resolve => setTimeout(resolve, delay, result)));
  };
  fn.then = resolve => fn().then(resolve); // использование функции как thennable
  return fn;
}

const req = wait(2000)
.then(() => {
  console.log('Подготовка данных...');

  const data = {
    name: 'Personal computer',
    model: 'MSI',
    price: 120000,
    weightKG: 10,
  };

  return data;
})
.then(wait(2000))
.then(data => {
  console.log('Обработка данных...');
  data.status = 'order';
  data.discount = '20%';
  data.price -= 120000 * parseInt(data.discount, 10) / 100;

  return data;
})
.then(wait(2000))
.then(data => {
  console.log('Выписка чека...');
  data.check = `№${Math.floor(Math.random() * 100000000)}`;

  return data;
})
.then(wait(2000))
.then(data => {
  console.log(`Данные получены:
1.Наименование: ${data.name}
2.Модель: ${data.model}
3.Цена: ${data.price}
4.Вес: ${data.weightKG}
5.Статус: ${data.status}
6.Скидка: ${data.discount}
7.Чек: ${data.check}`);
})
.then(wait(2000))
.then(() => {
  console.log('...:::С новым годом!:::...');
});

Понятно что у вас там не просто setTimeout, ну так и выносить можно что угодно.)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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