Последовательность HTTP-запросов в Angular 6 с RxJS
Моя цель - сохранить информацию на бэкэнд-сервере с помощью POST-запросов. Мне нужно, чтобы эти запросы выполнялись один за другим по завершении предыдущего. Но мне нужно добавить немного логики между запросами. Эти запросы выполняются с использованием RxJs Observables.
Я дам вам некоторый контекст. Мое приложение имеет 5 моделей: страна, штат, город, адрес, человек.
Человек имеет адрес, который принадлежит городу, который принадлежит государству, который принадлежит стране.
Каждая модель содержит свой "родительский" идентификатор в качестве внешнего ключа (например, City имеет атрибут "state_id").
Вся информация доступна через форму. Поэтому, когда я отправляю форму, я хочу сохранить эту информацию на своем внутреннем сервере.
Для этого мне нужно проверить (с помощью запроса GET), существует ли страна / штат / город / адрес в базе данных, если это нужно, мне нужно привязать его идентификатор к "ребенку", в противном случае мне нужно POST он и затем привязывает свой идентификатор к "ребенку".
Как мне этого добиться? Я провел некоторое исследование и попытался сделать этот трубопровод concatMap()
операторы. Но моя проблема: как я могу concat
эти запросы?
Это то, что я до сих пор:
this.countrySvc.getCountryByName(countryAux.name).pipe(
concatMap(country1 => {
if (country1[0] != null){
/*Country exists in DB*/
countryAux.id = country1[0].id;
return of(country1[0]);
}
else{
/*Country is not in DB, i need to save it before continuing*/
this.countrySvc.postCountry(countryAux).pipe(
concatMap(country2 => {
countryAux.id = country2.id;
return of(country2);
})
)
.subscribe();
return of(countryAux);
}
}),
concatMap(country3 => {
console.log("Checking what do I get here: " + country3.name + " " + country3.id);
return country3;
})
)
.subscribe();
Я не могу понять, как сделать это правильно. Последовательность запросов, которые я ищу:
GET country // Search by name
if it exists
state.country_id = ID /*ID comes in response*/
else
POST country /*ID comes in response*/
state.country_id = ID
/*Once this (or these) previous request(s) complete*/
/*---------So far i have implemented up to here---------*/
GET province
if it exists
city.state_id = ID
else
POST state
city.state_id = ID
/*Once this (or these) previous request(s) complete*/
GET city
if it exists
address.city_id = ID
else
POST city
address.city_id = ID
/*Once this (or these) previous request(s) complete*/
GET address
if it exists
person.address_id = ID
else
POST address
person.address_id = ID
/*Once this (or these) previous request(s) complete*/
POST person
Как мне это сделать? Обратите внимание, что моя главная проблема заключается в том, что иногда мне нужно будет делать некоторые POST-запросы между некоторыми GET-запросами, а иногда нет. Однако мне нужно будет вернуть некоторые Наблюдаемые (с данными Страна / Штат / Город...) в каждой ситуации следующему оператору.