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

Что значит фабрика промисов. Не понятен пример ниже?

Кусок статьи с хабра. Если надо скину ссылку. Непонятен верный вариант с последовательным выполнением промисов (сначала идёт неверный), с использованием фабрик промисов. А если конкретно что значит:
А потому, что наша фабрика не создаст промис до тех пор, пока до него не дойдет очередь.


Допустим, вы хотите выполнить серию промисов один за другим, последовательно. Вы хотите что-то вроде Promise.all(), но такой, чтобы не выполнял промисы параллельно.

function executeSequentially(promises) {
  var result = Promise.resolve();
  promises.forEach(function (promise) {
    result = result.then(promise);
  });
  return result;
}


К сожалению, пример выше не будет работать так, как задумывалось. Промисы из списка, переданного в executeSequentially(), все равно начнут выполняться параллельно.

Причина в том, что по спецификации промис начинает выполнять заложенную в него логику сразу после создания. Он не будет ждать. Таким образом, не сами промисы, а массив фабрик промисов — это то, что действительно нужно передать в executeSequentially:

function executeSequentially(promiseFactories) {
  var result = Promise.resolve();
  promiseFactories.forEach(function (promiseFactory) {
    result = result.then(promiseFactory);
  });
  return result;
}
На самом деле фабрика — это простая функция, возвращающая промис:

function myPromiseFactory() {
  return somethingThatCreatesAPromise();
}

Почему этот пример будет работать? А потому, что наша фабрика не создаст промис до тех пор, пока до него не дойдет очередь. Она работает именно как resolveHandler для then()
  • Вопрос задан
  • 436 просмотров
Подписаться 2 Простой 2 комментария
Решения вопроса 1
alex_keysi
@alex_keysi
Помог с решением? Отметь “правильный ответ”
Я так понимаю этот весь текст скропирован с хабра.
Тут смысл в том что в момент создания промиса , функция переданная в него сразу выполнится. Поэтому естли сразу создать все промисы , то они выполнятся сразу.
Т е проблема в том что все промисы создались сразу. До вызова функции из первого кода, который не работает.
Как сделать так чтобы промисы создавались только тогда, когда мы это захотим?
Обернуть в функцию. Функция это отложенный код, который не нужно выполнять прям сейчас.
Вот и говорит автор , что давайте обернем создание промиса на потом, т е в функцию. В данном случае функция это фабрика. Фабрика это тип функции ( более широко паттерн). Просто чтобы понимать, что эта функция вернет созданный промис. Которые мы создаем отложенно при каждом then га result
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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