javascript - Varför fortsätter setInterval() inuti Observable.create() att köra?
Jag studerar rxjs Observables och jag kunde inte förstå varför setInterval inuti Observable.create fortfarande körs även om jag har avprenumererat från det observable-objektet. Observable är asynkron, eller hur? När ska det sluta?
Jag har den här koden som referens:
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);
Svar #1
setInterval schemaläggs av JavaScripts runtime. När du avslutar prenumeration på en Observable som kallade setInterval säger ingen åt runtime att avbryta den schemalagda åtgärden. Du kanske faktiskt vill låta intervallet fortsätta i vissa användningsfall.
Så istället måste du själv anropa clearInterval vid avprenumeration som du returnerar från Observables callback:
const source$ = new Observable(observer => {
const handler = setInterval(...);
...
return () => clearInterval(handler);
});
Svar #2
setInterval är inte beroende av ditt observerbara, det kommer att fortsätta köras tills du rensar det genom att använda clearInterval()-funktionen. För att rensa intervallet måste du använda det returnerade intervalID (som returneras från setInterval()).
Exempel:
// Assigning an intervalID to a variable
const intervalID = setInterval(() => {
// Do some stuff here...
}, 2000);
// Clearing an interval
clearInterval(intervalID);
Källa och ytterligare information
