Последовательность 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-запросами, а иногда нет. Однако мне нужно будет вернуть некоторые Наблюдаемые (с данными Страна / Штат / Город...) в каждой ситуации следующему оператору.

0 ответов

Другие вопросы по тегам