問題がダウンし、この行にある:
subject.unsubscribe((v) => {
console.log(v);
});
Subject
implements ISubscription
。つまり、unsubscribe
メソッドとclosed
プロパティを持っています。多少残酷である
unsubscribe() {
this.isStopped = true;
this.closed = true;
this.observers = null;
}
を次のようにそのimplementation of unsubscribe
です。基本的に、サブスクライバの登録を解除することなく、そのサブスクライバとのすべての通信を切断します。同様に、サブスクライブは、サブスクライブされる可能性のある観察可能なものからサブジェクト自体を購読解除しません。
これは、実際にはどのように使用されているのか分かりませんが、どのように使用されるのかは不明です。 this testの説明: - 退会処分と命名された
it('should disallow new subscriber once subject has been disposed',() => {
は、それがRxJS 4から二日酔いのいくつかの並べ替えであるかもしれないことを示唆しています。
その理由は何でも、私は決してそれを呼び出すことをお勧めします。一例として、このスニペットを見て:それは、被験者から観察合成に加入し、次いで観察ソースの対象をサブスクライブし、
const source = Rx.Observable
.interval(200)
.take(5)
.do(value => console.log(`source: ${value}`));
const subject = new Rx.Subject();
source.subscribe(subject);
const subscription = subject
.switchMap(() => Rx.Observable
.interval(200)
.take(5)
.delay(500))
.subscribe(value => console.log(`subscription: ${value}`));
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
。
unsubscribe
た場合は、問題のカップルが明らかになる、被写体に呼び出されます。
- ソースへの被験者のサブスクリプションが解除ではなく、ソースは、被験者の
next
メソッドを呼び出そうとしたときにエラーが行われます。
- サブジェクトから構成されたオブザーバブルのサブスクリプションはサブスクライブされていないため、
switchMap
内で観測可能なinterval
はunsubscribe
コールが発信された後でも発信し続けます。
それを試してみてください:この
const source = Rx.Observable
.interval(200)
.take(5)
.do(value => console.log(`source: ${value}`));
const subject = new Rx.Subject();
source.subscribe(subject);
const subscription = subject
.switchMap(() => Rx.Observable
.interval(200)
.take(5)
.delay(500))
.subscribe(value => console.log(`subscription: ${value}`));
setTimeout(() => {
console.log("subject.unsubscribe()");
subject.unsubscribe();
}, 700);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
どれもそうSubject
にunsubscribe
を呼び出して、望ましい行動のように見えない避けるべき何かがあります。
代わりに、あなたのスニペット内のコードはsubscribe
呼び出しによって返さSubscription
使用して解除する必要があります。この答えを書くに続き
const subscription = subject.subscribe((v) => {
console.log(v);
});
subscription.unsubscribe();
を、私は合うBen Leshからfollowing commentを、見つけました被験者の処分に関連していると私の理論では考えています。
0123のときに被験者に大声で怒ってもらいたい場合はそれが有用になった後でそれにを追加すると、unsubscribe
をサブジェクトインスタンス自体に直接呼び出すことができます。
は、[このテスト](https://github.com/ReactiveX/rxjs/blob/5.4.2/spec/subjects/AsyncSubject-spec.ts#L125-L141)それは道あなたが行動する必要があります示唆しますそれを期待しています、そうではありませんか?何か他のことが起こっていますか? – cartant
こんにちは、ありがとう、[このplunker](https://plnkr.co/edit/wFRWuiyWtsolP5CESdaA?p=preview)にチェックしてください。他に何もありません。 –
これはちょっとタイプミスのようです。 'subject.subscribe'呼び出しの結果を変数に代入します(結果はサブスクリプションです)。サブジェクトではなくサブスクリプションに対して' unsubscribe'を呼び出します。その変化に伴い、私は予想していたことをしているようです。 – cartant