为什么在可观察对象中使用setInterval时使用clearInterval

时间:2019-05-13 19:32:41

标签: typescript rxjs

为什么我们已经取消订阅observable(具有setInterval)时为什么需要返回带有clearInterval的函数。即使我不返回函数clearInterval,它也会给出相同的结果。请参见下面的示例 https://www.learnrxjs.io/operators/creation/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

2 个答案:

答案 0 :(得分:1)

如您所链接的LearnRxJs页面底部的official docs for create链接所示:

  

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

还将订阅功能定义为以下内容(强调我的意思):

  

接受观察者并根据需要调用其nexterrorcomplete方法的函数,并且(可选)返回一些清理资源的逻辑

这里的目标是给RxJs足够的信息,以在知道不再调用资源时知道如何清理资源。在此,如果RxJ知道间隔计时器不相关,则可以清除该计时器。没错,这不会对正确性产生直接影响-您的函数将以相同的方式返回-但它确实为您提供了很好地使用内存并保持清理独立的机会

答案 1 :(得分:0)

setInterval下,回调将继续重复,直到调用clearInterval以停止重复为止。这是标准JavaScript的一部分,与其他代码(例如您创建的Observable对象)分开处理。