2017-10-05 4 views
0

J'ai essayé à peu près tout ce que je peux trouver et je n'arrive pas à obtenir cet intervalle pour arrêter de faire le code dans l'abonnement. Suis-je en utilisant l'intervalle faux?Impossible d'arrêter l'intervalle Observable

var subject = new Subject(); 
var interval = Observable.interval(this.settings.timing * 1000); 
var subscription = interval 
    .takeUntil(subject) 
    .subscribe(t => { 
    console.log('pushing new item'); 
    this.activeItems[0].contentLeaving = true; 
    setTimeout(()=>{ 
    this.activeItems[0].imageLeaving = true; 
    setTimeout(()=>{ 
     this.activeItems.push(this.activeItems.shift()); 
     setTimeout(()=>{ 
     this.activeItems[1].contentLeaving = false; 
     this.activeItems[1].imageLeaving = false; 
     },510); 
    },510); 
    },510); 
}); 
this.moduleProps.intervals.push(subject); 

Dans mon ngOnDestroy

this.moduleProps.intervals.forEach((i)=>{ 
    i.complete(); 
}); 

Mais après cela arrive, je vois encore la déclaration de journal de la console en disant « pousser nouvel élément » comme si elle est toujours en cours d'exécution sur mon intervalle.

+0

Vous pouvez appeler 'subscription.unsubcscribe()' 'l'intérieur subscribe()'. Ou peut-être que je ne comprends pas ce que vous voulez faire ... – martin

Répondre

0

Selon cette documentation (https://www.learnrxjs.io/operators/filtering/takeuntil.html), takeUntil émet jusqu'à ce que l'observable fourni émette. Vous complétez l'observable sans rien émettre. Essayez d'ajouter .next() à votre méthode onDestroy.

this.moduleProps.intervals.forEach((i)=>{ 
    i.next(); // have subject emit 
    i.complete(); 
}); 

Voici un Plunk de travail (https://plnkr.co/edit/Zdf8C9d8vHk84uIMYHvH?p=preview)

+0

J'ai essayé cela aussi, aussi '.next()' passer quelque chose en arrière et l'intervalle continue. – Jordan

+1

@Jordan, pouvez-vous simplement stocker votre abonnement d'intervalle (s), puis dans votre ngOnDestroy se désabonner de ceux pour arrêter l'intervalle. Au lieu d'utiliser l'opérateur takeUntil – LLai

+0

j'ai essayé cela aussi, cela ne fonctionne pas non plus. Fait intéressant, si j'essaie d'appeler '.next()' et '.compelte()' immédiatement après les avoir configurés dans un délai d'expiration, tout fonctionne parfaitement. Cela ne fonctionne pas lorsque j'essaie d'utiliser la référence plus tard. – Jordan

0

Essayez .takeWhile au lieu de .takeUntil, il peut utiliser un booléen.

private finished = false; // component property 

var interval = Observable.interval(this.settings.timing * 1000); 
var subscription = interval 
    .takeWhile(_ => this.finished) 
    .subscribe(t => { 
    ... 

OnDestroy est alors simplement this.finished = true;

+0

takeWhile prend une fonction supposée renvoyer un booléen, pas seulement un booléen – LLai

+0

En effet, en corrigeant ... –