typescript - 为什么在 observables 中使用 setInterval 时使用 clearInterval
问题描述
当我们已经取消订阅 observable(具有 setInterval)时,为什么我们需要返回带有 clearInterval 的函数。即使我不返回函数 clearInterval,它也会给出相同的结果。参考下面的示例 https://www.learnrxjs.io/运营商/创作/create.html
我尝试删除返回线,它给出了相同的结果
const evenNumbers = Observable.create(function(observer) {
let value = 0;
const interval = setInterval(() => {
if (value % 2 === 0) {
observer.next(value);
}
value++;
}, 1000);
return () => clearInterval(interval); ---> why is it necessary
});
const subscribe = evenNumbers.subscribe(val => console.log(val));
setTimeout(() => {
subscribe.unsubscribe();
}, 10000);
在每种情况下,结果都是 0 2 4 6 8
解决方案
正如在您链接的 LearnRxJs 页面底部的链接的官方文档中一样:create
onSubscription 可以选择返回一个函数或一个带有
unsubscribe
方法的对象。在这两种情况下,函数或方法都会在取消订阅 Observable 时被调用,并且应该用于清理所有资源。因此,例如,如果您setTimeout
在自定义 Observable 中使用,当有人取消订阅时,您可以清除计划的超时时间,这样它就不会不必要地触发,并且浏览器(或其他环境)不会在没有人会的时间事件上浪费计算能力还是听听吧。
它还将订阅功能定义如下(强调我的):
一个接受 Observer 的函数,并根据需要调用其
next
、error
和complete
方法,并可选地返回一些用于清理资源的逻辑。
这里的目标是为 RxJs 提供足够的信息,以便在它知道不再调用资源时如何清理资源。在这里,如果 RxJs 知道间隔计时器无关紧要,它可以清除计时器。没错,这不会立即对正确性产生影响——无论哪种方式,你的函数都会返回相同的结果——但它确实让你有机会很好地使用内存并保持清理自包含。