В Chrome 128 добавили поддержку нового метода Promise.try.
Данный метод решает проблему упаковки значения в контейнер промиса при вызове функции. Например:
В чем тут проблема? В том, что
Или даже так:
Почему? Ну, дело в том, что по контракту, все методы Promise должны всегда возвращать значение в контейнере. И все синхронные исключения должны перехватывается и обрабатывается как Rejected Promise.
А вот с Promise.resolve возникали проблемы, так как метод ожидал не функцию, а само значение и осуществить перехват исключения из самого метода уже никак нельзя.
Но вот теперь можно написать вот так:
Удобно. Радует, что стандартная библиотека JS получает человеческое лицо.
Данный метод решает проблему упаковки значения в контейнер промиса при вызове функции. Например:
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 получает человеческое лицо.