wake-up-neo.com

RXJS Observable doSomething onComplete

Ich möchte den RXJS Observable verwenden. Im Prinzip funktioniert es gut, aber ich muss nicht nur reagieren, wenn observer.next () , sondern auch wenn observer.complete () aufgerufen wird. Wie bekomme ich das Ereignis von OnComplete eines RXJS Observable? Meiner Meinung nach ist das RXJS-Dokument verwirrend.

export class Service {
    myMethod():Observable<any> {
        return Observable.create((observer:any) => {
        for(let i=0; i<10; i++) {
         observer.next(i);
        }
        if(true==true) {
            // this event I need
            observer.complete();
        } else {
            observer.error(xhr.response);
        }
    }
}

export class Component() {
    // constructor etc.

    doSome() {
        this.service.myMethod()
        // Here I would like to get OnComplete event
          .catch(this.handleError)
          .subscribe((num:any) => {
            console.log(num);
        });
    }
}
9
Johannes

Die subscribe-Methode akzeptiert drei Rückrufe. Der letzte ist für die gesamte Veranstaltung.

doSome() {
  this.service.myMethod()
      .subscribe((num:any) => {
        console.log(num);
      }, (err) => {
        this.handleError(err);
      }, () => { // <----
        this.handleComplete();
      });
}

Sie können dazu auch den Operator finally nutzen.

doSome() {
  this.service.myMethod()
      .catch(this.handleError)
      .finally(this.handleComplete) // <----
      .subscribe((num:any) => {
        console.log(num);
    });
}

Anmerkung: Es gibt einen Unterschied zwischen den beiden Beispielen für den Fall, dass wir Fehler haben: würden wir console.logs hinzufügen, würden wir im ersten Fall nur handleError sehen. wird gedruckt

-> handleError

im zweiten Fall

-> handleError
-> finally

mit anderen Worten: finally wird immer aufgerufen, complete nicht. 

15

Als Thierry Templier antwortete, besteht eine Möglichkeit darin, den finallyname __/finalize( rxjs docs ) (Jedoch nicht dasselbe wie die Verwendung des completename__, siehe Notizen) zu nutzen.


last

Eine weitere Option, um etwas abzuschließen, ist last( rxjs/last )

 enter image description here

0