我正在研究rxjs Observables,即使我取消订阅该Observable对象,我也无法理解为什么Observable.create内部的setInterval仍在运行。可以观察到异步吗?它什么时候应该停止?
我有以下代码可供参考:
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);
答案 0 :(得分:3)
setInterval
由JavaScript的运行时安排。取消订阅名为setInterval
的Observable时,没有人告诉运行时取消计划的操作。您实际上可能希望在某些用例中保持间隔运行。
因此,相反,您必须在退订时致电clearInterval
,而退订是从Observable
的回调返回的:
const source$ = new Observable(observer => {
const handler = setInterval(...);
...
return () => clearInterval(handler);
});
答案 1 :(得分:2)
setInterval
并不取决于您的观察对象,它将继续运行,直到您使用clearInterval()
函数将其清除为止。要清除间隔,您必须使用返回的intervalID
(从setInterval()
返回)。
示例:
// Assigning an intervalID to a variable
const intervalID = setInterval(() => {
// Do some stuff here...
}, 2000);
// Clearing an interval
clearInterval(intervalID);