Skip to content

Instantly share code, notes, and snippets.

@dSalieri
Last active July 11, 2025 05:58
Show Gist options
  • Save dSalieri/b02fc5da1fa4fbfbcc3793f6dfc48cb2 to your computer and use it in GitHub Desktop.
Save dSalieri/b02fc5da1fa4fbfbcc3793f6dfc48cb2 to your computer and use it in GitHub Desktop.
Полифил для Promise.try

В ECMAScript 2025 был добавлен статический метод Promise.try. Его задача превратить работу синхронных функций в привычную нам promise манеру, то есть результат выполнения синхронной функции будет превращен в promise объект.

Эта небольшая заметка позволит вам реализовать полифил по спецификации (если вам это конечно нужно).

Вот как выглядит реализация на js, которая максимально (но не совсем точно) приближена к спецификации:

Для успешной работы данного полифила вам потребуется определение операции NewPromiseCapability взять ее можно здесь

Promise.try = Promise.try || function (callback, ...args) {
  const C = this;

  if (typeof C !== "object" && typeof C !== "function" || C === null) {
    throw TypeError("C is not an object");
  }

  const promiseCapability = NewPromiseCapability(C);
  
  try {
    Reflect.apply(promiseCapability["[[Resolve]]"], undefined, [Reflect.apply(callback, undefined, args)]);
  } catch (e) {
    Reflect.apply(promiseCapability["[[Reject]]"], undefined, [e]);
  }
  
  return promiseCapability["[[Promise]]"];
}

Ну и как пример:

Promise.try(() => 5); /// Promise {<fulfilled>: 5}
Promise.try(() => {throw Error(5)}); /// Promise {<rejected>: Error: 5...

В различных статьях вы можете увидеть замену Promise.try в виде такого кода:

new Promise((resolve) => resolve(callback())); /// Где callback это любая ваша функция, которая вызывается на месте

И это правда, по спецификации передаваемое значение в resolve, будет обработано необходимым образом для того чтобы результат new Promise получил правильное состояние. Минус такой записи, неочевидность и сложная запись.

Можно сделать удобную обертку:

Promise.try = Promise.try || function (callback, ...args) {
    return new Promise((resolve) => resolve(callback(...args)));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment