Если вы хотите связать обещания, вы можете сделать так, чтобы каждый обработчик возвращал обещание, а затем оттуда связывает функции then
и catch
. Я считаю, что это демонстрирует то, что вы хотите сделать:
const getPromise = (time, reject=false) => new Promise((res, rej) => {
setTimeout(() => reject ? rej() : res('done'), time);
});
getPromise(500)
.then(() => {
console.log('first response');
return getPromise(500, false);
})
.then(() => {
console.log('second response');
return getPromise(500, true);
})
.catch((error) => {
console.log('you can have catch statements return promises, too');
return getPromise(700, true)
})
.then(() => {
// this structure falls down here; is this a response to the promise returned from
// the catch, or the promise returned from the 'second response' part?
console.log('third response');
})
.catch(() => {
console.error('hit an error');
});
Однако важно понимать, что это цепочка без логики ветвления. Со структурой handle success
-> handle error
-> handle success
, как только ваши обработчики ошибок возвращают действительные обещания, оставшаяся часть цепочки не может сказать, было ли то, что было раньше, результатом успеха или обработчиками ошибок. Здесь нет логики ветвления, и для этого нужно вложить обещания.
Здесь есть две основные альтернативы. Сначала вы можете выдавать разные типы ошибок и обрабатывать каждую отдельную ошибку в одном обработчике catch
. Во-вторых, вы можете использовать синтаксис async
/ await
. Любой из них может работать на вас, но я думаю, что они требуют отдельного вопроса.