Последовательность HTTP-запросов в Angular 6 с RxJS - PullRequest
0 голосов
/ 29 декабря 2018

Моя цель - сохранить информацию на бэкэнд-сервере с помощью запросов POST.Мне нужно, чтобы эти запросы выполнялись один за другим по завершении предыдущего.Но мне нужно добавить немного логики между запросами.Эти запросы выполняются с использованием RxJs Observables .

Я дам вам некоторый контекст.Мое приложение имеет 5 моделей: Страна, Штат, Город, Адрес, Персона.

Лицо имеет адрес, принадлежащий городу, принадлежащий штату, который принадлежитСтрана.

Каждая модель содержит свой «родительский» идентификатор в качестве внешнего ключа (например, город имеет атрибут «state_id»).

Вся информация доступна через форму.Поэтому, когда я отправляю форму, я хочу сохранить эту информацию на своем внутреннем сервере.

Для этого мне нужно проверить (с помощью запроса GET), существует ли страна / штат / город / адрес в базе данных, если это необходимо, мне нужно привязать его идентификатор к «потомку»в противном случае мне нужно отправить его, а затем привязать его идентификатор к «ребенку».

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

...