В моем проекте angular 7 в рамках инициализации компонента выполняется последовательность HTTP-запросов.После каждого запроса я получаю ответ, а затем запускаю следующий запрос.
В настоящее время я поместил HTTP-запрос в службу и вызвал их из моего компонента.Мои функции HTTP-запроса имеют дополнительные функции RXJS, включая тайм-аут и повторный запрос через функцию .pipe.Обработка ошибок выполняется в компоненте.
Чтобы выполнить цепочку, после завершения одного запроса я вызываю следующий запрос в другой функции.Мне понадобятся данные ответа первого запроса для выполнения следующих ответов.
Проблема заключается в том, что нынешний способ, которым я был прикован цепью, выглядит действительно грязно и трудно поддается отслеживанию.
Есть ли лучший способ для цепочки HTTP-запросов?
Я знаю, что есть функция форка rxjs, но немного запутался, как реализовать это, особенно когда у меня есть обработка ошибок и каналы.
Примечание. Ошибки обрабатываются одинаково для запросов.
Полный код ниже и заранее спасибо.
Component
formData: any;
style: any;
subscribers:any[];
constructor(private webService: WebService){}
ngOnInit(){
let id: number = 1;
this.getFormData(id);
}
getFormData(id: number) {
this.webService.getFormData(id)
.subscribe(
data => {
this.formData = data;
this.getFormStyle(this.formData.style_id);
},
err => {
// Error handler
}
)
}
getFormStyle(id: number) {
this.webService.getFormStyle(id)
.subscribe(
data => {
this.style = data;
this.getFormSubscribers(this.formData.subscriber_id);
},
err => {
// Error handler
}
)
}
getFormSubscribers(id: number) {
this.webService.getFormSubscribers(id)
.subscribe(
data => {
this.subscribers = data;
},
err => {
// Error handler
}
)
}
WebService
API данных формы
getFormData(id: number): any {
let headers: any = this.headerService.getHeaders();
return this.http.get('www.test.com/form/data/' + id, {headers: headers})
.pipe(timeout(25000))
.pipe(retryWhen(errors => errors
.pipe(map((err, index) => {
// No Error, throw immediately
if (!err) {
throw err;
}
// Caught error (ie not disconnected), throw immediately
if (err.status !== 0) {
throw err;
}
// Disconnection repeat to limit
if (index === 2) {
throw err;
}
return err;
}))
.pipe(delay(2000))))
.pipe(map(res => res.json()))
}
API стилей форм
getFormStyle(style_id:number) {
let headers: any = this.headerService.getHeaders();
return this.http.get('www.test.com/form/style/' + style_id, {headers: headers})
.pipe(timeout(25000))
.pipe(retryWhen(errors => errors
.pipe(map((err, index) => {
// No Error, throw immediately
if (!err) {
throw err;
}
// Caught error (ie not disconnected), throw immediately
if (err.status !== 0) {
throw err;
}
// Disconnection repeat to limit
if (index === 2) {
throw err;
}
return err;
}))
.pipe(delay(2000))))
.pipe(map(res => res.json()))
}
API подписчиков форм
getFormSubscribers(subscriber_id:number) {
let headers: any = this.headerService.getHeaders();
return this.http.get('www.test.com/form/subscribers/' + subscriber_id, {headers: headers})
.pipe(timeout(25000))
.pipe(retryWhen(errors => errors
.pipe(map((err, index) => {
// No Error, throw immediately
if (!err) {
throw err;
}
// Caught error (ie not disconnected), throw immediately
if (err.status !== 0) {
throw err;
}
// Disconnection repeat to limit
if (index === 2) {
throw err;
}
return err;
}))
.pipe(delay(2000))))
.pipe(map(res => res.json()))
}