Всякий раз, когда вы звоните .then
(или .catch
) по существующему обещанию, у вас есть новый Promise
. Ошибка возникает из цепочки Promise, созданной
p.then(()=> console.log('Then'));
нигде не пойман.
Любая цепь .catch
соединяется с .then
:
const p = new Promise((resolve, reject) => {
throw new Error('Oops..');
});
p
.then(() => console.log('Then'))
.catch(err => console.log(err.message));
console.log('The end');
Обратите внимание, что при создании Promise рекомендуется всегда явным образом вызывать reject
при возникновении ошибки, чтобы гарантировать, что потребитель этого Promise может обнаружить проблемы. Например, в следующем коде p
будет не отклоняться и останется неразрешенным навсегда, поскольку ошибка возникла асинхронно:
const p = new Promise((resolve, reject) => {
setTimeout(() => {
throw new Error('Oops..');
});
})
p
.then(() => console.log('Then'))
.catch(err => console.log(err.message))
console.log('The end');
Лучше позвонить reject
:
const p = new Promise((resolve, reject) => {
setTimeout(() => {
reject('Oops..');
});
})
p
.then(() => console.log('Then'))
.catch(err => console.log(err))
console.log('The end');