Объект Promise.

  Promise - Самое распространенное название этого объекта - "Обещание".
  Экземпляр объекта Promise запускает, асинхронно в фоновом режиме, заданный код скрипта и предоставляет интерфейс для связи с ним.
  В отличие от объекта Worker, объект Promise является встроенным объектом JavaScript, и скриптам его экземпляров доступны все объекты DOM.
  Кроме того, интерфейс с Worker основан на событиях. Функционал Promise же, по мнению создателей "обещания", призван устранить коллизии, имеющие место быть из за того, что событие может возникнуть до того, как для него установлен обработчик.
  "Обещание" всегда хранит информацию о своём состоянии, не зависимо от того, готово-ли оно уже к выдаче ожидаемого от него результата, или же находится в процессе его получения.
  Ключевое слово тут всегда. В отличие от события, которое возникает одномоментно, и доступно для обработки только в этот момент, только что включенный обработчик "обещания" может получить от него уже имеющийся результат, или дождаться выполнения "обещания" его выдачи.
  Соответственно "обещание", в каждый текущий момент времени, может находиться в одном из четырех состояний:
  1. pending - Выполняется. Ожидайте.
  2. fulfilled - Выполнено. Имеется результат.
  3. rejected - Не выполнено, но выполняться больше не будет. Имеется причина невыполнения.
  4. settled - Может выполнено, а может не выполнено. Но выполняться больше не будет, а результат, или причину невыполнения, как хотите, так и добывайте.
  Вообще-то говоря, хоть эти термины и установлены стандартом, но в свойствах объекта Promise нигде не определены.
  Экземпляр доступен:

  1. В выражении

          new Promise(Функция)

    где:
    • new - Ключевое слово.
    • Promise - Имя функции конструктора объекта Promise.
    • Функция - Любой операнд значения со значением функция.
        Эту функцию назовём функцией "обещания". Она и реализует функционал этого "обещания", и должна иметь два аргумента.
        Браузер немедленно, вызывает функцию "обещания" для асинхронного выполнения её кода, подставив на место аргументов две, стандартных для Promise, функции обратного вызова. У каждой функции обратного вызова имеется по одному аргументу.

      1. К первой функции обратного вызова надо обратиться в теле функции "обещания", если необходимо завершить выполнение "обещания" с "обещанным" результатом.
      2. Ко второй функции обратного вызова надо обратиться в теле функции "обещания", если необходимо завершить выполнение "обещания" без "обещанного" результата, надежды на выполнение "обещания" нет, но есть причина невыполнения.

        Как правило, на место аргумента первой функции обратного вызова подставляют "обещанный" результат, на место аргумента второй функции обратного вызова - экземпляр объекта Error.

        Обращение к любой из функций обратного вызова, в теле функции "обещания", немедленно приводит к остановке её выполнения, а это "обещание" (экземпляр объекта Promise) в состояние fulfilled или, соответственно, rejected, в котором оно и будет далее находиться всегда.

        Выполнение в теле функции "обещания" оператора throw, или возникновение ошибки времени выполнения, равноценно обращению ко второй функции обратного вызова, с аргументом равным конечному значению выражения оператора throw, или соответствующему экземпляру объекта Error.

        Выполнение в теле функции "обещания" оператора return, до обращения к одной из функций обратного вызова, приведёт "обещание" в состояние settled, и от него уже ничего не дождаться.

  2. С помощью метода then объекта Promise
  3. С помощью метода catch объекта Promise
  4. С помощью метода all конструктора "обещаний"
  5. С помощью метода race конструктора "обещаний"
  6. С помощью метода resolve конструктора "обещаний"
  7. С помощью метода reject конструктора "обещаний"
  Методы.
  then - Устанавливает интерфейс с "обещанием", указанным экземпляром объекта.
  В случае обработки результата или причины невыполнения "обещания" возвращает ссылку на новый экземпляр объекта Promise.
  Для одного "обещания", методом then, можно установить сколько угодно интерфейсов. Функции обратного вызова, каждого такого интерфейса, заданные аргументами метода then будут вызываться соответственно последовательности установки этих интерфейсов в коде скрипта.

Формат записи в коде скрипта:

  • Экземпляр объекта Promise.then(Функция для результата[, Функция для причины невыполнения])

Значения формата записи:

  • Экземпляр объекта Promise - Любой операнд значения со значением экземпляра объекта Promise.
  • . - Оператор доступа к методу объекта.
  • then - Ключевое слово.
  • ( - Оператор группировки. Ключевое слово в этом формате.
  • Функция для результата - Любой операнд значения со значением функция.
      Эта функция должна имееть один аргумент.
      Браузер немедленно, вызывает эту функцию при достижении (или нахождении в) состояния(и) fulfilled этого "обещания", подставив на место аргумента значение переданного результата.

      Если эта функция вернет любое значение, кроме экземпляра объекта Promise, то метод then вернет экземпляр объекта Promise в состоянии fulfilled с результатом равным этому значению.

      Если эта функция вернет экземпляр объекта Promise, то метод then вернет этот экземпляр объекта Promise.

      Если, при выполнении кода этой функции, возникнет ошибка времени выполнения, или сработает оператор throw, то метод then вернет экземпляр объекта Promise в состоянии rejected с причиной равной соответствующему экземпляру объекта Error, или конечному значению выражения оператора throw.
  • , - Оператор группировки. Ключевое слово в этом формате.
  • Функция для причины невыполнения - Любой операнд значения со значением функция.
      Эта функция должна имееть один аргумент.
      Браузер немедленно, вызывает эту функцию при достижении (или нахождении в) состояния(и) rejected этого "обещания", подставив на место аргумента значение причины невыполнения.

      Если эта функция вернет любое значение, кроме экземпляра объекта Promise, то метод then вернет экземпляр объекта Promise в состоянии fulfilled с результатом равным этому значению.

      Если эта функция вернет экземпляр объекта Promise, то метод then вернет этот экземпляр объекта Promise.

      Если, при выполнении кода этой функции, возникнет ошибка времени выполнения, или сработает оператор throw, то метод then вернет экземпляр объекта Promise в состоянии rejected с причиной равной соответствующему экземпляру объекта Error, или конечному значению выражения оператора throw.

      Если этот аргумент опущен в методе then, а его "обещание" достигло (или находится в) состояния(и) rejected, то метод then вернет экземпляр объекта Promise в состоянии rejected с причиной равной значению причины невыполнения своего "обещания".
  • ) - Оператор группировки. Ключевое слово в этом формате.

  Таким образом, поскольку метод then всегда возвращает экземпляр объекта Promise в состоянии fulfilled или rejected с заданными значениями результата или причины невыполнения, или экземпляр объекта Promise, результата или причины невыполнения которого можно дождаться, то можно строить "цепочки" метода then, а, следовательно, "цепочки" "обещаний".
  catch - Устанавливает интерфейс с "обещанием", указанным экземпляром объекта.
  В случае обработки причины невыполнения "обещания" возвращает ссылку на новый экземпляр объекта Promise.
  Для одного "обещания", методом catch, можно установить сколько угодно интерфейсов. Функции обратного вызова, каждого такого интерфейса, заданные аргументами метода catch будут вызываться соответственно последовательности установки этих интерфейсов в коде скрипта.

Формат записи в коде скрипта:

  • Экземпляр объекта Promise.catch(Функция для причины невыполнения)

Значения формата записи:

  • Экземпляр объекта Promise - Любой операнд значения со значением экземпляра объекта Promise.
  • . - Оператор доступа к методу объекта.
  • catch - Ключевое слово.
  • ( - Оператор группировки. Ключевое слово в этом формате.
  • Функция для причины невыполнения - Любой операнд значения со значением функция.
      Эта функция должна иметь один аргумент.
      Браузер немедленно, вызывает эту функцию при достижении (или нахождении в) состояния(и) rejected этого "обещания", подставив на место аргумента значение причины невыполнения.

      Если эта функция вернет любое значение, кроме экземпляра объекта Promise, то метод catch вернет экземпляр объекта Promise в состоянии fulfilled с результатом равным этому значению.

      Если эта функция вернет экземпляр объекта Promise, то метод catch вернет этот экземпляр объекта Promise.

      Если, при выполнении кода этой функции, возникнет ошибка времени выполнения, или сработает оператор throw, то метод catch вернет экземпляр объекта Promise в состоянии rejected с причиной равной соответствующему экземпляру объекта Error, или конечному значению выражения оператора throw.

      Если "обещание" метода catch, достигло (или находится в) состояния(и) fulfilled, то метод catch вернет экземпляр объекта Promise в состоянии fulfilled с результатом равным значению результата своего "обещания".
  • ) - Оператор группировки. Ключевое слово в этом формате.

  Поскольку метод catch, по существу является методом then со значением первого аргумента равным null, то catch, точно также может участвовать в "цепочках" метода then.
  Механизм функционала "обещаний" довольно замысловат, поэтому он требует отдельного пояснения:

  Допустим, что вы хотите выполнить какой-либо код, который не может выполняться браузером синхронно с интерпретацией HTML-кода. Тогда вы должны оформить этот код отдельной функцией (назовём её функцией A), и запустить её выполнение с помощью выражения -

      Val B = new Promise(A);

  В этом случае переменная B будет содержать ссылку на соответствующий экземпляр объекта Promise, а функция A должна иметь два аргумента (назовём их X и Y). Браузер подставит на место этих аргументов две стандартные для Promise функции, у каждой из которых будет по одному аргументу. Следовательно, эти функции будут доступны в теле функции A как X и Y.
  В коде функции A вы должны предусмотреть вызов - X(результат), если вашей функцией A искомый результат будет получен, и вызов - Y(ошибка), если что-то пошло не так.
  Далее вы должны написать ещё две функции (назовём их C и D) для обработки результата и(или) ошибки. Функции C и D должны иметь по одному аргументу.
  Затем выражением -

      B.then(C,D)

  вы должны задать эти функции для обработки результата и(или) ошибки.
  И, в случае вызова функции X или Y в коде вашей функции A, браузер вызовет, соответственно вашу функцию C или D передав им через их аргумент результат или ошибку.

  Не надо забывать, что обе функции C и D, в случае выполнения в них оператора return, также вернут экземпляр объекта Promise, с готовым результатом, который вернёт соответствующий оператор return функции C или D.
  Так и получаются цепочки "обещаний", которые можно строить до бесконечности.
   Очевидно, что сама логика функционала "обещаний" не очень проста, а созданный на его основе код не очень нагляден. Из-за непохожести механизма выполнения "обещаний" на всё, что было да них, в среде разработчиков сложилось мнение о некой "продвинутости" технологии Promise. Так это или нет, а так же не являются ли причины появления "обещаний" чисто умозрительными, можно спорить. Однако в DOM функционал Promise уже используется, и с этим необходимо считаться.