web-dev-qa-db-ja.com

最終的に購読可能

this artcle によれば、onCompleteonErrorおよびsubscribe関数は相互に排他的です。

onErrorまたはonCompleteイベントのいずれかが意味するのは、subscribeで起動します。
エラーが発生したか、情報のSteamを正常に終了したかどうかにかかわらず、実行する必要があるロジックブロックがあります。

pythonのfinally のようなものを探しましたが、見つかったのは finally だけで、これは作成するobservableにアタッチする必要があります。

しかし、このロジックを実行したいのは、サブスクライブしたとき、およびストリームが終了した後、成功したかエラーであったかだけです。

何か案は?

64
Amir Tugi

この演算子の現在の「pipable」バリアントは、finalize()と呼ばれます(RxJS 6以降)。古い、現在廃止された「パッチ」演算子はfinally()と呼ばれていました(RxJS 5.5まで)。

finalize()演算子は実際に正しいと思います。あなたは言う:

私が購読するとき、そしてストリームが終了した後にのみそのロジックを実行します

これは問題ではないと思います。単一のsourceを使用し、必要に応じてサブスクライブする前にfinalize()を使用できます。この方法ではalwaysを使用する必要はありませんfinalize()

let source = new Observable(observer => {
  observer.next(1);
  observer.error('error message');
  observer.next(3);
  observer.complete();
}).pipe(
  publish(),
);

source.pipe(
  finalize(() => console.log('Finally callback')),
).subscribe(
  value => console.log('#1 Next:', value),
  error => console.log('#1 Error:', error),
  () => console.log('#1 Complete')
);

source.subscribe(
  value => console.log('#2 Next:', value),
  error => console.log('#2 Error:', error),
  () => console.log('#2 Complete')
);

source.connect();

これはコンソールに出力されます:

#1 Next: 1
#2 Next: 1
#1 Error: error message
Finally callback
#2 Error: error message

2019年1月:RxJS 6用に更新

87
martin

私のために働いた唯一のものはこれです

fetchData()
  .subscribe(
    (data) => {
       //Called when success
     },
    (error) => {
       //Called when error
    }
  ).add(() => {
       //Called when operation is complete (both success and error)
  });
18
Hari Das

AngularアプリケーションでRxJS 5.5.7を使用していますが、finalize演算子を使用すると、成功またはエラーコールバックの前に起動されるため、ユースケースで奇妙な動作をします。

簡単な例:

// Simulate an AJAX callback...
of(null)
  .pipe(
    delay(2000),
    finalize(() => {
      // Do some work after complete...
      console.log('Finalize method executed before "Data available" (or error thrown)');
    })
  )
  .subscribe(
      response => {
        console.log('Data available.');
      },
      err => {
        console.error(err);
      }
  );

サブスクリプションでadd medhodを使用して、目的を達成する必要がありました。基本的に、成功またはエラーコールバックが行われた後のfinallyコールバック。 try..catch..finallyブロックまたはPromise.finallyメソッドと同様です。

簡単な例:

// Simulate an AJAX callback...
of(null)
  .pipe(
    delay(2000)
  )
  .subscribe(
      response => {
        console.log('Data available.');
      },
      err => {
        console.error(err);
      }
  );
  .add(() => {
    // Do some work after complete...
    console.log('At this point the success or error callbacks has been completed.');
  });
13
pcasme