Preciso de um cronômetro no Angular 2, que marque após um intervalo de tempo e faça alguma tarefa (pode ser chamada de algumas funções).
Como fazer isso com o Angular 2?
javascript
angular
kuntal
fonte
fonte
Respostas:
Além de todas as respostas anteriores, eu faria isso usando RxJS Observables
verifique Observable.timer
Aqui está um código de amostra, começará após 2 segundos e, em seguida, avança a cada segundo:
E aqui está um êmbolo de trabalho
Atualizar Se quiser chamar uma função declarada na classe AppComponent, você pode fazer o seguinte:
** Supondo que a função que você deseja chamar seja chamada de func ,
O problema com a abordagem acima é que se você chamar 'this' dentro de func, ele se referirá ao objeto assinante em vez do objeto AppComponent, que provavelmente não é o que você deseja.
No entanto, na abordagem a seguir, você cria uma expressão lambda e chama a função func dentro dela. Dessa forma, a chamada para func ainda está dentro do escopo do AppComponent. Esta é a melhor forma de o fazer na minha opinião.
verifique este plunker para código de trabalho.
fonte
timer
parece usarsetInterval()
. Mas, você pode passar oanimationFrame
planejador (que usarequestAnimationFrame()
) para usá-lo em vez doasync
planejador padrão . Tudo que você precisa fazer éObservable.timer(*,*,Scheduler.animationFrame)
, dadoimport {Scheduler} from ‘rxjs’
.Embora,timer
nele não pareça funcionar. Ainda parece usarsetInterVal()
. No entanto, em outros tipos de observáveis, comoObservable.range(0,1000,Scheduler.animationFrame)
, orequestAnimationFrame
é usado com certeza. Em termos de desempenho, não posso responder com certeza agora.Outra solução é usar TimerObservable
TimerObservable é uma subclasse de Observable.
PS: Não se esqueça de cancelar a assinatura.
fonte
this.subscription.unsubscribe();
cancela a inscrição.fonte
Com rxjs 6.2.2 e Angular 6.1.7, eu estava recebendo um:
erro. Isso foi resolvido substituindo
Observable.timer
portimer
:fonte
Você pode simplesmente usar o utilitário setInterval e usar a função de seta como retorno de chamada para que
this
aponte para a instância do componente.Por ex:
Dentro de seu gancho de ciclo de vida ngOnDestroy, limpe o intervalo.
fonte
Enfrentei um problema que tive que usar um timer, mas tive que exibi-los em 2 componentes ao mesmo tempo, mesma tela. Criei o timerObservable em um serviço. Assinei o cronômetro em ambos os componentes, e o que aconteceu? Não será sincronizado, porque uma nova assinatura sempre cria seu próprio fluxo.
O que eu gostaria de dizer, é que se você planeja usar um timer em vários lugares, coloque sempre
.publishReplay(1).refCount()
no final do Observer, pois ele publicará o mesmo stream fora dele todas as vezes.Exemplo:
fonte
Encontrou um pacote npm que facilita isso com RxJS como um serviço.
https://www.npmjs.com/package/ng2-simple-timer
Você pode 'assinar' um cronômetro existente para não criar um bazilhão de cronômetros se estiver usando-o muitas vezes no mesmo componente.
fonte
Se você deseja executar um método no ngOnInit, pode fazer algo assim:
importe estas 2 bibliotecas de RXJS:
Em seguida, declare o temporizador e a assinatura privada, por exemplo:
Por último, mas não menos importante, execute o método quando o cronômetro parar
Isso é tudo, Angular 5
fonte
fonte