03. Promise Creation

Создать Promise можно одним из нескольких способов:

  • При помощи конструктора new Promise(executor);

  • Создать Promise с одним из установленных значений:

    • Promise.resolve();

    • Promise.reject().

  • Получить Promise вызвав одну из асинхронных операций, возвращающих Promise;

  • Конвертировать вызов функции с callback в функционально идентичный Promise.

new Promise(...) constructor

Promise-ы создаются при помощи конструктора new Promise(...):

new Promise(executor);
new Promise(function(resolve, reject) { ... });

Example:

function delay(ms) {
  return new Promise(function(resolve, reject) {
    setTimeout(resolve, ms); // (A)
  });
}

// Using delay():
delay(5000).then(function() {
  // (B)
  console.log("5 seconds have passed!");
});

Executor

Передаваемый в конструктор Promise параметр называется executor.

Executor - это функция с двумя параметрами resolve и reject. Первый аргумент используется для успешной установки Promise, тогда как второй для неуспешной.

  • Если вычисление прошло успешно, то результат посылается при помощи resolve(value)

  • Если вычисление завершилось аварийно, то клиент Promise уведомляется об ошибке при помощи reject(error).

Например:

После вызова resolve/reject Promise переходит в одно из установленных состояний – с результатом (resolve), или ошибкой (reject):

It’s important to note that only the first call made to either of these methods will have an impact – once a promise is settled, it’s result can’t change. The example below creates a promise that’s fulfilled in the allowed time or rejected after a generous timeout:

Если внутри executor было выброшено исключение, то это аналогично выражению reject(new Error(...)):

Executor выполняется синхронно вместе с созданием Promise, но любые обработчики всегда выполняются асинхронно.

Если ни reject ни resolve не были вызваны, то обработчики на Promise так и не сработают и Promise будет когда-нибудь собран сборщиком мусора.

Settled Promise

Создать Promise c определенным состоянием можно при помощи одного из следующих методов:

  • Promise.resolve(value|promise|thenable) - создает Promise с состоянием fulfilled и с установленным значением.

  • Promise.reject(value|promise|thenable) - создает Promise с состоянием rejected и с установленным значением.

Promise.resolve

The Promise.resolve(value) method returns a Promise object that is resolved with the given value. If the value is a thenable (i.e. has a "then" method), the returned promise will "follow" that thenable, adopting its eventual state; if the value was a promise, that object becomes the result of the call to Promise.resolve; otherwise the returned promise will be fulfilled with the value.

Promise.resolve is good for wrapping synchronous code:

util.promisify()

Node 8 has a new utility function: util.promisify(). It converts a callback-based function to a Promise-based one.

Last updated

Was this helpful?