Как стать автором
Обновить

Комментарии 17

Только лучше все таки Promise не пользоваться по возможности. Где встречаю, стараюсь переписать на async/await.

На собеседованиях в основном по Промисам гоняют =)

Ну, это и есть промисы, просто в более удобном и понятном виде)

А ничего что async/await просто синтаксический сахар над Promise?

Я прекрасно это знаю, и использование этого syntactical sugar позволяет избежать многих ошибок как например в примере выше.

для того, чтобы пользоваться syntactic (не syntactical, тактического в нем ничего нет) sugar, очень полезно знать, поверх чего он работает... Тем более любая асинхронная функция таки возвращает Promise.

с собеса, несложная:

const p = Promise.reject();
p.then(() => console.log('ok'));
p.catch(() => console.log('error'));

Объяснить, почему выскакивает "UnhandledPromiseRejection", хотя хотя вроде бы навесили catch.

Вообще, у меня ошибка не возникла, но предположу, потому что здесь нет чейнинга

  1. Создали промис

  2. Обработали только then - тут нет catch и будет ошибка

  3. Обработали только .catch отдельно


    Если так переписать, то будет корректно

Promise.reject()
    .then(() => console.log('ok'))
    .catch(() => console.log('error'))
Так это же разные примеры. То, что вы написали — это не то же самое, что написал Alexandroppolus.
Когда вы навешивает then'ы после создания промиса, то они не выстраивают одну цепочку, а будут выполняться параллельно.

Красиво, пришлось думать. Не сразу допёр "сосчитать" промисы, попадающие в очередь (в смысле что p.then() – это новый промис).

Upd: Забавно, похоже все, кроме меня, мыслят чейнами, а не отдельными промисами. Надо подумать, какое восприятие проще (видимо, чейны) и нет ли в мышлении чейнами каких-то подводных камней.

Надо мыслить отдельными чейнами )

Еррор выскакивает только на тех отклоненных промисах, которые последние в цепочке (т.е. для которого ни разу не вызвали then или catch). В моем примере поздно было ловить ошибку на первом промисе - она уехала во второй.

вот, например, в таком раскладе:

const p = Promise.reject();
p.then(() => console.log('ok'));
p.then(() => console.log('ok'));

выскочит 2 "Unhandled", потому что 2 конечных промиса, хотя всего 3 отклоненных.

Потому что все новые чейны на уже созданный промис навешиваются, а не в одну цепочку.
У вас:
p.then()
p.catch()

Не связаны друг с другом и выполняются параллельно.

Если нужен один чейн, то либо в одну цепочку вешайте:
const p = Promise.reject();
p.then(() => console.log('ok'))
 .catch(() => console.log('error'));


Либо сразу при создании, как anton-sergeenkov написал.
  • ".then" - обработчик событий Promise onRejected"

  • ".catch" - обработчик события Promise "onRejected"

чего?

у .then 2 аргумента: первый обрабатывает "onFulfilled", а второй "onRejected" - таким образом, .then можно использовать как замена .catch

.catch, в свою очередь, обрабатывает только "onRejected"

Кстати, важный момент, если использовать формат .then(resolveHandler, rejectHandler), то rejectHandler не поймает ошибку, возникшую внутри resolveHandler в текщуем then-е.
Или в следующем then-е её ловить, или проще и безопаснее всегда ловить всё в catch.

Очень хотел такой материал и обрадовался, когда заголовок увидел. Но был обескуражен (ноль иронии), когда не нашел задач. Задача - это "что надо сделать" (условие) и "как это сделать" (ответ, решение). А тут, получается, примеры кода с пояснениями. В таком виде оно все тоже ценно, но обещаны-то задачи. Эх. Может, есть где-то именно задачник на промисы и async/await, который проведет по всем нюансам?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории