Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Concatenate rxjs Observables

Is it possible to concatenate multiple observables?

For example: I have 3 function:

ensureUserLogged():Observable<boolean>

createEntity():Observable<Entity>

checkEntity():Observable<boolean>

I would like to do something like:

Observable.combine (ensureUserLogged(), createEntity(), checkEntity()).subscribe (
    checkEntityResult => console.log (checkEntityResult),
    error => console.log (error)
);

or something like:

ensureUserLogged().then (logged => createEntity()).then (newEntity => checkEntity ())...

Otherwise I need to write a ugly piramid:

ensureUserLogged().subscribe (
    res => {
        createEntity ().subscribe (
            res => {
                checkEntity ().subscribe (
                    res => { console.log ("I'm finally here") },
                    error {}
                )
            },
            err => {
            }
        );
    },
    err => {
    }
)

Is there something to achieve my will?

Thanks

like image 997
user3471528 Avatar asked Feb 08 '23 09:02

user3471528


1 Answers

You need to use Observable.forkJoin for parallel execution:

Observable.forkJoin(ensureUserLogged(), createEntity(), checkEntity()).subscribe (
  checkEntityResult => console.log (checkEntityResult),
  error => console.log (error)
);

checkEntityResult will correspond to an array containing each elements: the first one for the result of ensureUserLogged, ...

To execute things in series, you need to use the flatMap operator:

ensureUserLogged().flatMap((resultOfEnsureUserLogged) => {
  return createEntity();
}).flatMap((resultOfCreateEntity) => {
  return checkEntity();
}).subscribe((resultOfChekEntity) => {
  (...)
});

You can notice that you can mix things. For example something like that:

ensureUserLogged().flatMap((resultOfEnsureUserLogged) => {
  return Observable.forJoin(createEntity(), checkEntity());
}).subscribe((resultOfCreateEntityAndChekEntity) => {
  (...)
});
like image 55
Thierry Templier Avatar answered Feb 11 '23 18:02

Thierry Templier