J'ai besoin d'une minuterie dans Angular 2, qui coche après un intervalle de temps et effectue une tâche (peut-être appeler certaines fonctions).
Comment faire cela avec Angular 2?
javascript
angular
Kuntal
la source
la source
Réponses:
En plus de toutes les réponses précédentes, je le ferais en utilisant les observables RxJS
veuillez vérifier Observable.timer
Voici un exemple de code, démarrera après 2 secondes, puis cochera toutes les secondes:
Et voici un plunker de travail
Mettre à jour Si vous souhaitez appeler une fonction déclarée sur la classe AppComponent, vous pouvez effectuer l'une des opérations suivantes:
** En supposant que la fonction que vous souhaitez appeler s'appelle func ,
Le problème avec l'approche ci-dessus est que si vous appelez 'this' à l'intérieur de func, il se référera à l'objet abonné au lieu de l'objet AppComponent, ce qui n'est probablement pas ce que vous voulez.
Cependant, dans l'approche ci-dessous, vous créez une expression lambda et appelez la fonction func à l' intérieur. De cette façon, l'appel à func est toujours dans la portée d'AppComponent. C'est la meilleure façon de le faire à mon avis.
vérifiez ce plunker pour le code de travail.
la source
timer
semble utilisersetInterval()
. Mais, vous pouvez passer leanimationFrame
planificateur (qui utiliserequestAnimationFrame()
) pour l'utiliser à la place duasync
planificateur par défaut . Tout ce que vous avez à faire estObservable.timer(*,*,Scheduler.animationFrame)
, étant donné.import {Scheduler} from ‘rxjs’
Bien quetimer
cela ne semble pas fonctionner. Il semble toujours utilisersetInterVal()
. Cependant, sur d'autres types d'observables tels queObservable.range(0,1000,Scheduler.animationFrame)
, lerequestAnimationFrame
est utilisé à coup sûr. en termes de performances, je ne peux pas vous répondre avec certitude pour le moment.Une autre solution consiste à utiliser TimerObservable
TimerObservable est une sous-classe de Observable.
PS: N'oubliez pas de vous désabonner.
la source
this.subscription.unsubscribe();
désabonne.la source
Avec rxjs 6.2.2 et Angular 6.1.7, j'obtenais un:
Erreur. Ce problème a été résolu en remplaçant
Observable.timer
partimer
:la source
Vous pouvez simplement utiliser l'utilitaire setInterval et utiliser la fonction de flèche comme rappel pour
this
pointer vers l'instance du composant.Par exemple:
Dans votre hook de cycle de vie ngOnDestroy, effacez l'intervalle.
la source
J'ai rencontré un problème que je devais utiliser une minuterie, mais je devais les afficher en 2 composants en même temps, même écran. J'ai créé le timerObservable dans un service. Je me suis abonné au minuteur dans les deux composants et que s'est-il passé? Il ne sera pas synchronisé, car le nouvel abonnement crée toujours son propre flux.
Ce que je voudrais dire, c'est que si vous prévoyez d'utiliser une minuterie à plusieurs endroits, toujours placée
.publishReplay(1).refCount()
à la fin de l'Observer, car il publiera le même flux à chaque fois.Exemple:
la source
Nous avons trouvé un package npm qui rend cela facile avec RxJS en tant que service.
https://www.npmjs.com/package/ng2-simple-timer
Vous pouvez vous «abonner» à un minuteur existant pour ne pas créer un bazillion de minuteries si vous l'utilisez plusieurs fois dans le même composant.
la source
Si vous cherchez à exécuter une méthode sur ngOnInit, vous pouvez faire quelque chose comme ceci:
importez ces 2 bibliothèques depuis RXJS:
Ensuite, déclarez le minuteur et l'abonnement privé, exemple:
Dernière mais non la moindre méthode d'exécution lorsque la minuterie s'arrête
C'est tout, Angular 5
la source
la source