Объясните прицип работы фабрик promis'ов

142
08 мая 2019, 19:00

.Мне не понятно,как работает фабрика для выполнения промисов последовательно. Это кусок статьи с хабра.. https://habr.com/company/mailru/blog/269465/

Допустим, вы хотите выполнить серию промисов один за другим, последовательно. Вы хотите что-то вроде 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().

READ ALSO
Способ определения четности JavaScript

Способ определения четности JavaScript

В книге нашел способ определения четности:

158
Как совместить JSON_REMOVE и JSON_SEARCH в одном запросе?

Как совместить JSON_REMOVE и JSON_SEARCH в одном запросе?

У меня есть таблица test, в которой есть поле json с форматом данных JSONВ этом поле лежит массив [2, 3, 4, 5]

150
Как вывести имя вместо id, SQL?

Как вывести имя вместо id, SQL?

Для изображенной схемы БД необходимо составить запрос, который вернет список всех счетовДля каждого счета выбрать поля номер счета, дата...

160