webentwicklung-frage-antwort-db.com.de

RxJs Observables verschachtelte Abonnements?

Wie kann man so etwas wie das folgende Codebeispiel vereinfachen? Ich kann den richtigen Operator nicht finden. Kann jemand ein kurzes Beispiel geben?

this.returnsObservable1(...)
  .subscribe(

    success => {

      this.returnsObservable2(...)
        .subscribe(

          success => {

            this.returnsObservable3(...)
              .subscribe(

                success => {
                   ...
                },
17
Max Solid

Wie in den Kommentaren erwähnt, suchen Sie nach dem Operator flatMap.

Weitere Details finden Sie in früheren Antworten:

Ihr Beispiel würde lauten:

this.returnsObservable1(...)
  .flatMap(success => this.returnsObservable2(...))
  .flatMap(success => this.returnsObservable3(...))
  .subscribe(success => {(...)}); 
18
user3743222

Früher für RxJS 5 beantwortet, landete ich auf dieser Seite, während ich 6 verwendete.

In dem Fall, dass Sie ebenfalls auf 6 sind (und ich denke, Sie sollten es jetzt sein), können Sie flatmap als Operator innerhalb von pipe verwenden.

Der Beispielcode von @ user3743222 wurde geändert:

this.returnsObservable1(...)
  .pipe(
    flatMap(success => this.returnsObservable2(...)),
    flatMap(success => this.returnsObservable3(...))
  )
  .subscribe(success => {(...)}); 
12
Mathijs Segers

Der switchMap-Operator kann ebenfalls hilfreich sein. Einige Beispiele, die den Nutzen von switchMap im Vergleich zu verschachtelten Abonnements beschreiben, finden Sie hier:

  1. situation mit verschachtelten Abonnements

Dieser Codepen enthält eine Demo: https://codepen.io/anon/pen/zdXBvP?editors=1111

Rx.Observable
  .interval(5000)
  .subscribe((val) => {
    console.log("outer:", val);
    Rx.Observable
      .interval(1000)
      .subscribe((ival) => {
        console.log("inner:", val, ival); 
      });
  });
  1. situation mit switchMap

Dieser Codepen enthält eine Demo: https://codepen.io/anon/pen/xLeOZW?editors=1111

Rx.Observable
  .interval(5000)
  .switchMap((val) => {
    console.log("outer:", val);
    return Rx.Observable.interval(1000).map((ival) => [val, ival]);
  })
  .subscribe((val) => {
    console.log("inner:", val[0], val[1]);
  });
6
sdec