Недавно я столкнулся с проблемой, которая возникла из-за асинхронной природы NodeJS.
У меня есть ситуация, когда я пытаюсь выдать request
на один сервер, и если он не работает (из-заtimeout
, например), я «заменяю» его - путем выдачи request
другому серверу для предоставления мне данных и продолжения выполнения кода.
В настоящий момент происходит то, что однажды catch
метод вызывается, я не уверен, как "вернуться" туда, где он остановился, и продолжить цепочку .then
(Promise).
Конечно, я могу написать код после .catch и посмотреть еговыполняется, но, вероятно, произойдут 2 вещи:
1. Этот код будет выполняться асинхронно «без ожидания».
2. Мне придется повторять большие куски кода снова и снова, одновременно вкладывая их в каждуюдругие, используя обещания и блокирующиеся блоки, которые возвысят «Обещания-цепочки-ад», и которые, очевидно, или, вероятно, не являются правильным способом достижения.
Краткое описание того, чего я пытаюсь достичь:
const options1 = {
method: 'GET',
timeout: 1500,
uri: 'https://www.example.com/'
}
const options2 = {
method: 'GET',
timeout: 1500,
uri: 'https://www.example.com/'
}
const options3 = {
method: 'GET',
timeout: 1500,
uri: 'https://www.example.com/'
}
//Code before
request(options1)
.then(function (response) {
//Server 1 is working - execute what's inside .then
request(options3)
.then(function (response) {
//Got the data from server 1 or 2, doesn't matter, now get the required data from server 3
})
.catch(function (err) {
//Timeout has been thrown, show an error and continue
console.log('Server 3 error occured, continuing.');
});
})
.catch(function (err) {
//Timeout has been thrown, show an error and continue
request(options2)
.then(function (response) {
})
.catch(function (err) {
//Server 2 doesn't work either, abord and notify the user
console.log('Server 2 error occured, continuing.');
});
console.log('Server 1 error occured, continuing.');
});
Должен ли я использовать внешнюю функцию для определения этих "маршрутов восстановления"?
Спасибо.