Комментарии 17
Только лучше все таки Promise не пользоваться по возможности. Где встречаю, стараюсь переписать на async/await.
На собеседованиях в основном по Промисам гоняют =)
Ну, это и есть промисы, просто в более удобном и понятном виде)
А ничего что async/await просто синтаксический сахар над Promise?
Я прекрасно это знаю, и использование этого syntactical sugar позволяет избежать многих ошибок как например в примере выше.
с собеса, несложная:
const p = Promise.reject();
p.then(() => console.log('ok'));
p.catch(() => console.log('error'));
Объяснить, почему выскакивает "UnhandledPromiseRejection", хотя хотя вроде бы навесили catch.
Вообще, у меня ошибка не возникла, но предположу, потому что здесь нет чейнинга
Создали промис
Обработали только then - тут нет catch и будет ошибка
Обработали только .catch отдельно
Если так переписать, то будет корректно
Promise.reject()
.then(() => console.log('ok'))
.catch(() => console.log('error'))
Когда вы навешивает 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"
- обработчик событий PromiseonRejected"
".catch"
- обработчик события Promise"onRejected"
чего?
у .then 2 аргумента: первый обрабатывает "onFulfilled", а второй "onRejected" - таким образом, .then можно использовать как замена .catch
.catch, в свою очередь, обрабатывает только "onRejected"
Очень хотел такой материал и обрадовался, когда заголовок увидел. Но был обескуражен (ноль иронии), когда не нашел задач. Задача - это "что надо сделать" (условие) и "как это сделать" (ответ, решение). А тут, получается, примеры кода с пояснениями. В таком виде оно все тоже ценно, но обещаны-то задачи. Эх. Может, есть где-то именно задачник на промисы и async/await, который проведет по всем нюансам?
Базовые задачи на Promise в JavaScript