В Chrome 128 добавили поддержку нового метода Promise.try.



Данный метод решает проблему упаковки значения в контейнер промиса при вызове функции. Например:



Promise.resolve(getValue()).then(console.log, console.error);




В чем тут проблема? В том, что getValue() может выбросить исключение и тогда Promise.resolve даже не выполнится. Вместо этого раньше приходилось писать вот так:



new Promise((resolve) => resolve(getValue())).then(console.log, console.error);




Или даже так:



Promise.resolve().then(getValue).then(console.log, console.error);




Почему? Ну, дело в том, что по контракту, все методы Promise должны всегда возвращать значение в контейнере. И все синхронные исключения должны перехватывается и обрабатывается как Rejected Promise.



// 'boom!'

new Promise(() => { throw 'boom!'; }).catch(console.error);



// 'boom!'

Promise.resolve().then(() => { throw 'boom!'; }).catch(console.error);




А вот с Promise.resolve возникали проблемы, так как метод ожидал не функцию, а само значение и осуществить перехват исключения из самого метода уже никак нельзя.



Но вот теперь можно написать вот так:



Promise.try(getValue).then(console.log, console.error);



Promise.try(() => { throw 'boom!'; }).catch(console.error);




Удобно. Радует, что стандартная библиотека JS получает человеческое лицо.