的问题是降低到这一行:
subject.unsubscribe((v) => {
console.log(v);
});
Subject
implements ISubscription
;这意味着它有一个unsubscribe
方法和一个closed
属性。它的implementation of unsubscribe
如下:
unsubscribe() {
this.isStopped = true;
this.closed = true;
this.observers = null;
}
这是有点残酷。从本质上讲,它可以切断与主题的任何订阅者的所有通信,而不必取消订阅。同样,它不会从可能会被订阅的任何可观察的事物中取消订阅主题本身。 (它也标记为已关闭/停止的主题,这是您错误的原因。)
鉴于它不会执行任何取消订阅,它应该如何使用尚不清楚。的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,与适合我的理论认为它与处理该主题有关:
如果你想让主体大声而愤怒地错误,当你next
完成后有用,您可以直接调用unsubscribe
对主题实例本身。
[This test](https://github.com/ReactiveX/rxjs/blob/5.4.2/spec/subjects/AsyncSubject-spec.ts#L125-L141)表明它应该表现出你的行为方式期待它,不是吗?其他事情还能继续吗? – cartant
嗯,谢谢,检查[这个运动员](https://plnkr.co/edit/wFRWuiyWtsolP5CESdaA?p=preview),没有其他东西 –
它看起来有点像打字错误,对我来说。将'subject.subscribe'调用的结果分配给一个变量(结果是订阅)并在订阅上调用'unsubscribe'而不是主题。随着这种变化,这个庞然大物似乎做到了我所期望的。 – cartant