web-dev-qa-db-ja.com

RXJS Observable doSomething onComplete

RXJS Observableを使用したいと思います。基本的には問題なく動作しますが、observer.next()が呼び出されたときだけでなく、observer.complete()が呼び出されたときにも反応する必要があります。 RXJS ObservableのOnCompleteのイベントを取得するにはどうすればよいですか?私の意見では、RXJSのドキュメントは混乱しています。

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);
        });
    }
}
12
Johannes

Subscribeメソッドは3つのコールバックを受け入れます。最後は完全なイベントです。

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

これには、finally演算子を利用することもできます。

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

note:エラーが発生した場合の2つの例には違いがあります。console.logsを追加すると、最初のケースではhandleErrorのみが出力されます。

-> handleError

2番目のケースでは

-> handleError
-> finally

つまり、finallyは常に呼び出され、completeは呼び出されません。

17

ティエリーテンプリエが答えたように、1つのオプションはfinally/finalizerxjs docs )を利用することです(ただし、completeイベントを使用するのとは異なります) 、注を参照)


最後

完了時に何かを行う別のオプションはlastrxjs/last )です

enter image description here

0