2016-10-06 10 views
2

から退会されていないのはなぜ我々は我々が使用するかなりの数の場所があります。RxJS機能toPromiseは、我々のアプリでは、サブスクリプション

someObservable.take(1).subscribe(onSuccessHandler, onFailureHandler); 

をしかし、サブスクリプションを使用すると、いくつかの時点で退会を心配する必要があり、それは常に簡単ではありません。

私はこれを単純化し、このように書き換えを考えていた:

someObservable.toPromise().then(onSuccessHandler).catch(onFailureHandler); 

しかし、私はそれが退会を気にしない理由を理解していないようですtoPromise()here)の実装を見ています。

コード内のコメントには、キャンセルはできないと言われていますが、メモリのリーク(この場合は実際にはそうです)のままにしておくだけです。

EDIT

は私が私を心配例を思い付いた:

Observable.timer(10, 10).toPromise().then((v) => console.log("I'm done")); 

は私が取得する観測は、ある場合はその値を持つ決して完全に彼らは決して完全な、私の約束そしてだけでなく、私はサブスクリプションオブジェクトにアクセスすることができないので、私はそのような観測値からの退会のための方法を持っていません(例えば、それらのタイムアウトと私の約束)。そして、それはメモリをリークします!

答えて

1

「キャンセルはできません」というコメントは、おそらく観測可能な完了とはまったく異なる約束のキャンセルを指します。あなたは慎重に観察する場合にオペレータの実装について、あなたは.subscribeは、その三つのパラメータで呼び出されたことを、表示されます。

    ストリーミング値に約束を拒否
  • のonErrorハンドラを保持している
  • onNextハンドラ
  • 開催された値

との約束ストリームが完了したときに行わunsubscriptionsの自動チェーンが存在するように、その後Rxjsが作品を流れ、流れがsubscrであることを同じように解決完了ハンドラibedには、自動的に購読の連鎖が行われます。もっとに関する情報については

が見てhere

3

私の推測では、約束を(ストリームである配列を好きではない)一度だけ解決されるので、それがあるということです。加入者は常に最新の値を保持し、失敗時には拒否し、完了時には最新の値に解決することに注意してください。

してみてください、あなたの自己のためにそれをしようとする:脱退については

Observable.timer(300,300).take(4).toPromise().then((v) => console.log('tick: ', v)); // logs "3", the last element 
    Observable.from(['a','b','c']).toPromise().then((v) => console.log('tick: ', v)); // logs "c", the last element 

を、それが完了時に自動的に行われ、その完了前に、あなたは完了時に、退会べきではありません、あなたは約束を解決し、静かに( observablesのデフォルト動作のために)unsubscribed。

関連する問題