为什么我们已经取消订阅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
答案 0 :(得分:1)
如您所链接的LearnRxJs页面底部的official docs for create
链接所示:
onSubscription可以选择使用
unsubscribe
方法返回函数或对象。在这两种情况下,取消对Observable的订阅时都将调用函数或方法,并且应将该函数或方法用于清理所有资源。因此,例如,如果您在自定义Observable中使用setTimeout
,则当某人取消订阅时,您可以清除计划的超时,这样它就不会不必要地启动,并且浏览器(或其他环境)不会浪费时间计算能力任何人都不会听的事件。
还将订阅功能定义为以下内容(强调我的意思):
接受观察者并根据需要调用其
next
,error
和complete
方法的函数,并且(可选)返回一些清理资源的逻辑。
这里的目标是给RxJs足够的信息,以在知道不再调用资源时知道如何清理资源。在此,如果RxJ知道间隔计时器不相关,则可以清除该计时器。没错,这不会对正确性产生直接影响-您的函数将以相同的方式返回-但它确实为您提供了很好地使用内存并保持清理独立的机会
答案 1 :(得分:0)
在setInterval
下,回调将继续重复,直到调用clearInterval
以停止重复为止。这是标准JavaScript的一部分,与其他代码(例如您创建的Observable对象)分开处理。