В 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)));
}