web-dev-qa-db-fra.com

RXJS Observable doQuelque chose surComplete

Je voudrais utiliser le RXJS Observable. En gros, cela fonctionne bien, mais je n’ai pas besoin de réagir lorsque observer.next () mais aussi lorsque observer.com plete () est appelé. Comment obtenir l’événement de OnComplete d'un observable RXJS? À mon avis, le document RXJS est source de confusion.

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

La méthode subscribe accepte trois callbacks. Le dernier est pour l'événement complet.

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

Vous pouvez également utiliser l'opérateur finally pour cela.

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

remarque: il existe une différence entre les deux exemples au cas où nous aurions des erreurs: si nous ajoutions console.logs, nous verrions que dans le premier cas seulement handleError est imprimé

-> handleError

dans le second cas

-> handleError
-> finally

en d'autres termes, finally est toujours appelé, si complete ne l'est pas. 

15
Thierry Templier

Comme Thierry Templier a répondu, une option consiste à tirer parti de la variable finally/finalize ( rxjs docs ) (Mais ce n'est pas la même chose que d'utiliser l'événement complete, voir les notes).


last

Une autre option pour compléter est last ( rxjs/last )

 enter image description here

0
Natan Braslavski