@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);
});
  • Вопрос задан
  • 98 просмотров
Решения вопроса 1
Aetae
@Aetae
Тлен
Технически правильно, но база программирования - вынесение повторяющихся действий в функции, условно как-то так:
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, ну так и выносить можно что угодно.)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Intspirit Краснодар
от 80 000 до 150 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽