首页 > 解决方案 > 为什么在 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

标签: typescriptrxjs

解决方案


正如在您链接的 LearnRxJs 页面底部的链接的官方文档中一样:create

onSubscription 可以选择返回一个函数或一个带有unsubscribe方法的对象。在这两种情况下,函数或方法都会在取消订阅 Observable 时被调用,并且应该用于清理所有资源。因此,例如,如果您setTimeout在自定义 Observable 中使用,当有人取消订阅时,您可以清除计划的超时时间,这样它就不会不必要地触发,并且浏览器(或其他环境)不会在没有人会的时间事件上浪费计算能力还是听听吧。

它还将订阅功能定义如下(强调我的):

一个接受 Observer 的函数,并根据需要调用其nexterrorcomplete方法,并可选地返回一些用于清理资源的逻辑

这里的目标是为 RxJs 提供足够的信息,以便在它知道不再调用资源时如何清理资源。在这里,如果 RxJs 知道间隔计时器无关紧要,它可以清除计时器。没错,这不会立即对正确性产生影响——无论哪种方式,你的函数都会返回相同的结果——但它确实让你有机会很好地使用内存并保持清理自包含。


推荐阅读