How to conditionally use the "flatmap" operator? (Angular 2 / rxjs)

What I'm trying to achieve is to conditionally execute a series of observables.

return observable.map(response => response)
       .flatmap(response1 => observable1(response1))
       .flatmap(response2 => observable2(response2))
       .flatmap(response3 => observable3(response3))

I need to check the answer1 and, if necessary, call the remaining observables, otherwise I need to return the answer1 and break the execution and so on.

I reviewed the following SO questions, but they don't seem to answer my question.

Conditionally select observable in RxJS

RXJS if with observable conditional

Handle error in RxJs flatMap stream and continue processing

I'm new to rxjs, so sorry if the question seems too lame.

Any help would be appreciated.

thank

+4
source share
4 answers

HTTP-, . concatMap(), , Observable .

, , ( HTTP-), takeWhile() filter().

filter():

return observable
    .concatMap(response => response)
    .filter(response1 => response1.whatever === true)
    .concatMap(response1 => observable1(response1))
    .filter(response2 => response2.whatever === true)
    .concatMap(response2 => observable2(response2))
    .filter(response3 => response3.whatever === true)

, filter. observable , . , filter .

takeWhile():

return observable
    .concatMap(response => response)
    .takeWhile(response1 => response1.whatever === true)
    .concatMap(response1 => observable1(response1))
    .takeWhile(response2 => response2.whatever === true)
    .concatMap(response2 => observable2(response2))
    .takeWhile(response3 => response3.whatever === true)

- takeWhile() false, , .

+4

- :

observable.map(res => res.json())
  .flatMap(json => {
      if (json.something === 'something') {
          return this.http.get('/anotherCall')
              .map(res => 'second response: ' + res);
      } else {
          return Observable.from(['just return something else']);
      }
  });

, .

+2

, n , :

 return observable
   .flatmap(r => {
        return r.value > 1 ? observable1(r) : Observable.of(r);
   })
   .flatmap(r => {
        return r.value > 2 ? observable2(r) : Observable.of(r);
   })
   .flatmap(r => {
        return r.value > 3 ? observable3(r) : Observable.of(r);
   })
+1

, ,

return response
         .concatMapTo(response1,(response2, response3) => 
             `${response2} ${response3}`
          );

,

data = response.subscribe(val => console.log(val)); // contains all three responses value

response2 response3.

Subscribing for a single object using different observables: If you want to combine data and properties from different observables, you can see this answer

0
source

Source: https://habr.com/ru/post/1671929/


All Articles