В общем случае нет смысла передавать функцию async
в функцию обещания then
или catch
.И никогда не имеет смысла передавать его в конструктор обещаний.Если вы собираетесь пойти async
, сделайте это раньше.Кроме того, если вы хотите отклонить обещание для тестирования и т. Д., Просто используйте Promise.reject('oe')
.
Чтобы поймать ошибку из функции async
с try
/ catch
, вы должныбыть в async
функции.В этом случае минимальным изменением вашего примера будет await
результат вызова catch
:
// Assuming this is in an `async` function, making only minimal changes
try {
const promise = new Promise(async (resolve, reject) => {
reject('oe')
})
.catch(async (err) => {
console.log('bbbbb', err)
throw err
})
await promise; // ***
} catch (err) {
console.log('aaaaa', err)
}
Если вы не используете функцию async
, вы можете 't try
/ catch
используется для перехвата ошибок из обещаний (включая вызов функции async
, поскольку они возвращают обещания).Вместо этого вы должны использовать обещание, возвращаемое catch
:
// Assuming this is NOT in an `async` function, making only minimal changes
const promise = new Promise(async (resolve, reject) => {
reject('oe')
})
.catch(async (err) => {
console.log('bbbbb', err)
throw err
})
.catch(err => {
console.log('aaaaa', err)
})
Внося большие изменения, если вы уже находитесь в функции async
, избавьтесь от then
иcatch
звонки:
// Assuming this is in an `async` function
try {
try {
await Promise.reject('oe');
} catch (innerError) {
console.log('bbbbb', innerError);
throw innerError;
}
} catch (outerError) {
console.log('aaaaa', outerError);
}