Сделайте один http-вызов на основе предыдущего результата - PullRequest
0 голосов
/ 19 сентября 2018

Мне нужно сделать два HTTP-вызова (первый GET и второй POST), второй на основе результата первого.

Вот ответ от GET:

{
    "weekNbr": "34-2017",
    "startDate": "2017-09-16",
    "endDate": "2017-09-22"
}

ЭтоЗатем ответ будет обработан и отправлен как POST-запрос со следующим JSON:

{
    "weekNbr": 34, (as received above)
    "year": 2017 (as received above)
}

Одно решение:

http.get(url1).pipe(
    map(do your maipulation)
).subscribe(
    (newlyCreatedObject) => {
        return http.post(url2,newlyCreatedObject);
    }
);

Но я не думаю, что это правильный путь.

ПРИМЕЧАНИЕ: Предполагается, что эти вызовы осуществляются в одной услуге.Если есть какие-либо операторы rxjs, которые делают то же самое, это будет высоко оценено.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Я подготовил эту фиктивную услугу:

import {of, Observable} from 'rxjs';
import {flatMap} from 'rxjs/operators';
/**
 * Dummy get observable.
 */
export class MyService {

  getInformation$(): Observable<{foo:string}> {
    return of({foo:'bar'});
  }

  postInformation$(params:{foo:string}): Observable<any> {
    return of({
      fooUpperCase: params.foo.toUpperCase() // Stupid transformation for demonstration only
    });
  }

  main() {
    this.getInformation$().pipe(
      flatMap(data => this.postInformation$(data)) // receive each next and return new observable. 
    ).subscribe(console.log);
  }
}

new MyService().main();

Только для демонстрации, у меня есть переключатель http observable на dummy of observable.

live sample

0 голосов
/ 19 сентября 2018

Вы можете использовать оператор flatMap/mergeMap, чтобы сделать два HTTP-запроса, один в зависимости от другого.

Как:

http.get(data).flatMap(res => {
    // res is response of Get
    // manipulate the data and passed in post call
    return http.post(data);
})
.map(res => {})
.catch(e => {});
...