使用RxJS的Angular 2+-关于take(1)和first()

使用RxJS的Angular 2+-关于take(1)和first(),angular,rxjs,angular2-observables,Angular,Rxjs,Angular2 Observables,通过阅读一些文档和问题,我发现使用first或take1是否会在完成时实际取消订阅有点不清楚。我想我的困惑是“完成”和“取消订阅”。说一个可观察的完成,这是否也意味着订阅被取消?我在考虑垃圾收集,而我需要知道,在第一次或第1次完成之后,可观察对象没有保留任何引用 如果这些功能没有退订,我需要知道最简单的方式完成后退订。或者这是必要的?源代码中的一些东西 先做,完成后实际退订 看来是这样 接受 受保护的_nextvalue:T:void{ const total=this.total; 常量计数=

通过阅读一些文档和问题,我发现使用first或take1是否会在完成时实际取消订阅有点不清楚。我想我的困惑是“完成”和“取消订阅”。说一个可观察的完成,这是否也意味着订阅被取消?我在考虑垃圾收集,而我需要知道,在第一次或第1次完成之后,可观察对象没有保留任何引用


如果这些功能没有退订,我需要知道最简单的方式完成后退订。或者这是必要的?

源代码中的一些东西

先做,完成后实际退订

看来是这样

接受

受保护的_nextvalue:T:void{ const total=this.total; 常量计数=++this.count; if count console.log'subscription1' .add=>console.log'teardown1' //发射6倍,然后“撕裂1” const subscription2=source1.take4.subscriptbex=>console.log'subscription2' .add=>console.log'teardown2' //发射4倍,然后“撕裂2” 但请注意,take只会在其下游取消订阅,而不是所有订阅observable的用户

const source2=可观测范围1,10 const subscription3=source2.subscriptionx=>console.log'subscription3' .add=>console.log'teardown3' //发射10倍,然后“撕裂3” const subscription4=source2.take5.subscriptbex=>console.log'subscription4' .add=>console.log'teardown4' //发射5倍,然后“撕裂4” 我需要知道,在第一次或第1次完成后,可观察对象没有保留任何引用

这有点棘手,这里是Observable.subscribe方法。似乎观测者没有保留对其三个参数中任何一个的引用,而是保留了对Observable.subscribe的引用

subscribeObserverNext?:PartialObserver |值:T=>void, 错误?:错误:any=>void, 完成?:=>作废:订阅{ const{operator}=这个; const sink=ToSubscriberObserverNext,错误,完成; if操作员{ operator.callsink,this.source; }否则{ sink.addthis.source?this.\u订阅链接:this.\u尝试订阅链接; } 如果sink.syncErrorThrowable{ sink.syncErrorThrowable=false; 如果抛出sink.syncError{ 抛出sink.syncErrorValue; } } 回流槽; } 这可以在下面的测试代码中看到。当订阅处于活动关闭状态时:false,订阅服务器在_subscriptions中引用了可观察的

const source3=可观察的间隔1000 常量subscription5=source3.subscriptbex=>{} console.logsource3 console.logsubscription5 控制台输出:

间隔可观察 期间:1000 调度程序:异步调度程序{…} _伊斯卡拉尔:错 __原型:可观察 订阅人 关闭:错误 目标:安全订户{…} 答案:错 syncErrorThrowable:false SyncError:错误 syncErrorValue:空 _父项:null _家长:空 _订阅:[异步操作] __协议:订阅 但当我们以take1结束订阅时

const source3=Observable.interval1000.take1 常量subscription5=source3.subscriptbex=>{} console.logsource3 console.logsubscription5 订户订阅设置为null,释放引用

订阅人 关闭:正确 目标:安全订户{…} 是的 syncErrorThrowable:false SyncError:错误 syncErrorValue:空 _父项:null _家长:空 _订阅:空 __协议:订阅
我不确定这是否可以被视为所有可观察/运营商/订户链的明确证据,但至少表明了验证您的特定用例的方法。

源代码中的一些内容

先做,完成后实际退订

看来是这样

接受

受保护的_nextvalue:T:void{ const total=this.total; 常量计数=++this.count; if count console.log'subscription1' .add=>console.log'teardown1' //发射6倍,然后“撕裂1” const subscription2=source1.take4.subscriptbex=>console.log'subscription2' .add=>console.log'teardown2' //发射4倍,然后“撕裂2” 但请注意,take只会在其下游取消订阅,而不是所有订阅observable的用户

const source2=可观测范围1,10 const subscription3=source2.subscriptionx=>console.log'subscription3' .add=>console.log'teardown3' //发射10倍,然后“撕裂3” const subscription4=source2.take5.subscriptbex=>console.log'subscription4' .add=>console.log'teardown4' //发射5倍,然后“撕裂4” 我需要知道,在第一次或第1次完成后,可观察对象没有保留任何引用

这有点棘手,这里是Observable.subscribe方法。似乎观测者没有保留对它的三个参数中任何一个的引用,而是subscribe “可观测性”是指保留对可观测对象的引用

subscribeObserverNext?:PartialObserver |值:T=>void, 错误?:错误:any=>void, 完成?:=>作废:订阅{ const{operator}=这个; const sink=ToSubscriberObserverNext,错误,完成; if操作员{ operator.callsink,this.source; }否则{ sink.addthis.source?this.\u订阅链接:this.\u尝试订阅链接; } 如果sink.syncErrorThrowable{ sink.syncErrorThrowable=false; 如果抛出sink.syncError{ 抛出sink.syncErrorValue; } } 回流槽; } 这可以在下面的测试代码中看到。当订阅处于活动关闭状态时:false,订阅方在_订阅中引用了可观察的

const source3=可观察的间隔1000 常量subscription5=source3.subscriptbex=>{} console.logsource3 console.logsubscription5 控制台输出:

间隔可观察 期间:1000 调度程序:异步调度程序{…} _伊斯卡拉尔:错 __原型:可观察 订阅人 关闭:错误 目标:安全订户{…} 答案:错 syncErrorThrowable:false SyncError:错误 syncErrorValue:空 _父项:null _家长:空 _订阅:[异步操作] __协议:订阅 但当我们以take1结束订阅时

const source3=Observable.interval1000.take1 常量subscription5=source3.subscriptbex=>{} console.logsource3 console.logsubscription5 订户订阅设置为null,释放引用

订阅人 关闭:正确 目标:安全订户{…} 是的 syncErrorThrowable:false SyncError:错误 syncErrorValue:空 _父项:null _家长:空 _订阅:空 __协议:订阅
我不确定这是否可以被视为所有可观察/运营商/订阅者链的明确证据,但至少表明了验证您的特定用例的方法。

当可观察完成或出现错误时,所有订阅者都会自动取消订阅:当可观察完成或出现错误时,所有订户将自动取消订阅: