javascript - 为什么 Observable.create() 中的 setInterval() 一直在运行?

标签 javascript node.js typescript rxjs

我正在研究 rxjs Observables,但我无法理解为什么即使我取消订阅了该可观察对象,Observable.create 中的 setInterval 仍在运行。 Observable 是异步的吗?它应该什么时候停止?

我有这段代码供引用:

var cancellableObserver = Observable.create((observer:any)=>{
try {
    observer.next("anyeong")
    observer.next("ande")
    console.log("logged once")
    setInterval(()=>{
        //this code block will keep running for every 2secs
        observer.next("eotteokke") //but this line will stop after unsubscribe
        console.log("will log every 2secs")
    },2000)
} catch (err) {
    observer.error(err);

}});

var cancellableSubscription = cancellableObserver.subscribe(
(x:any) =>addItem(x),
(err:any) =>addItem(err),
() => addItem("cancellable completed"));

setTimeout(() => {cancellableSubscription.unsubscribe();console.log("mary");}, 6001);

最佳答案

setInterval 由 JavaScript 的运行时安排。当您取消订阅一个名为 setInterval 的 Observable 时,没有人告诉运行时取消计划的操作。在某些用例中,您实际上可能希望保持间隔运行。

因此,您必须在从 Observable 的回调返回的取消订阅时自己调用 clearInterval:

const source$ = new Observable(observer => {
  const handler = setInterval(...);

  ...

  return () => clearInterval(handler);
});

关于javascript - 为什么 Observable.create() 中的 setInterval() 一直在运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57265753/

相关文章:

javascript - 为什么此代码会发出警报 "undefined"

javascript - 即使对 API 的请求成功,Ajax 成功函数也未触发,为什么?

mysql - node.js/express/mongodb 而不是 apache/mysql?

node.js - 查找 View 失败

node.js - 是否可以在没有python的情况下为node.js安装sharp?

reactjs - 如何将函数从父组件传递给类型为 assingable 的子组件

javascript - 如何跳过某些 div 在上下文中进行搜索?

angular - IF/ELSE IF/ELSE 以 Observable 作为条件

angular - 如何在 Angular 数据类型上使用 ngSwitch?

javascript - 这个 JavaScript 在后台发生了什么?