带有RxJS的Angular 6中的HTTP请求序列

时间:2018-12-29 08:39:06

标签: angular http rxjs observable concatmap

我的目标是通过POST请求将信息保存在后端服务器中。我需要在上一个请求完成时一一执行这些请求。但是我需要在请求之间添加一些逻辑。这些请求是使用 RxJs Observables 发出的。

我给你一些背景。我的应用程序有5种型号:国家,州,城市,地址,人。

一个人的地址属于城市,属于国家,属于国家。

每个模型均包含其“父” ID作为外键(例如,城市具有属性“ state_id”)。

所有信息均可通过表格获得。因此,当我提交表单时,我想将此信息保存在后端服务器中。

为此,我需要(通过GET请求)检查数据库中是否已经存在国家/州/城市/地址,如果需要,则需要将其ID绑定到“子级”,否则,需要发布它,然后将其ID绑定到“子”。

我该如何实现? 我已经进行了一些研究,并尝试使用这些管道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 

我如何做到这一点?请注意,我的主要问题是有时我需要在一些GET请求之间执行一些POST请求,而有时则不需要。但是,在每种情况下,我都需要将一些可观察到的(带有“国家/地区/州/城市...”数据)返回给下一个操作员。

0 个答案:

没有答案