RxJS Разрешить последовательность наблюдаемых, где каждый зависит от предыдущих - PullRequest
1 голос
/ 18 марта 2019

Мне нужно сделать серию http-вызовов, где каждый вызов зависит от предыдущих ответов (тел или заголовков).Как я могу добиться этого с помощью Observables?

Пока я сделал уродливые вложенные подписки:

this.http.get(url1)
.subscribe(response1 => {
    const params1 = something(response1);
    this.http.post(url2, params1)
    .subscribe(response2 => {
        const params2 = something(response1,response2);
        this.http.post(url3, params2)
       .subscribe(response3 => {
           const params3 = something(response1,response2,response3);
           this.http.post(url4, params3)
           .subscribe(response4 => {
               const params4 = something(response1,response2,response3,response4);
               this.http.post(url5, params4)
               .subscribe(response5 => console.log(response5));
           });
       });
    });
});

1 Ответ

0 голосов
/ 18 марта 2019

Вы можете попробовать использовать оператор плоской карты rxJS для лучшей читаемости.Я думаю, что это будет выглядеть следующим образом.rxJS6, вам нужно будет использовать оператор канала для этого.

Более простой пример

Вот более сложный пример решения, чтобы понять, что происходит.

public test(): Observable<any>
{
    return of([1]);
    //when subscribed to returns [1]
}

public testTwo(value): void
{
    console.log(value); // [1] <- comes from the observable
    this.fromEndpoint = value;
}

public testThree(example): Observable<any>
{
    if (example[0] === 1)
    {
        return of([3]);
        // return an array of [3] when subscribed to.
    }
}

public ngOnInit()
{
    this.test().pipe(flatMap(response1 => (this.testTwo(response1), 
    this.testThree(response1)))).subscribe(final => 
    {        
        console.log(final); 
        // this logs ['3'] as the calls are chained with flatMap
    }); 
}

Надеюсь, более простой пример, который я собрал, немного облегчит понимание.Это заставляет меня думать, что вы могли бы сделать следующее для предоставленного вами кода:

Решение

this.http.get(url1).pipe(
  flatMap(response1 => (this.exampleFunction(response1), this.http.get(response1))),
  flatMap(response2 => (this.responseValue = response2, this.http.get(response2))),
  flatMap(response3 => (this.exampleFunctionThree(response3), this.http.get(response3)))
).subscribe(final => {
    console.log(final);
    console.log(this.responseValue);
});  

Обратите внимание, что console.log(final); будет регистрировать только результатпоследнего наблюдаемого / API вызова и не собирать значения по пути.если вам нужно было собрать все значения, вы можете передать отдельную функцию для отправки ответа или объявить его по мере продвижения в более широкой области видимости.Я показал, что в приведенном выше примере.

Документация

flatmap и switchmap

of и подписок какони используются в примере

flatMap - псевдоним для mergeMap!

...