Si j'ai un délai d'attente actif qui a été défini var t = setTimeout("dosomething()", 5000)
,
Est-il possible de faire une pause et de le reprendre?
Existe-t-il un moyen d'obtenir le temps restant sur le délai d'expiration actuel?
ou dois-je dans une variable, lorsque le délai d'expiration est défini, stocker l'heure actuelle, puis nous nous arrêtons, obtenons la différence entre maintenant et alors?
javascript
timeout
Hailwood
la source
la source
Réponses:
Vous pourriez emballer
window.setTimeout
comme ceci, ce qui, je pense, est similaire à ce que vous suggériez dans la question:la source
setTimeout()
ne fonctionne pas dans Internet Explorer <= 9.timer.resume(); timer.resume();
vous finirez par avoir deux délais d'attente en parallèle. C'est pourquoi vous voudriez soit d'clearTimeout(timerId)
abord, soit faire unif (timerId) return;
court-circuit au tout début de la reprise.var timerId, start, remaining;
dehors de la portée de la classe et ajouterremaining = delay;
à l'intérieur pour attraper le paramètre. Fonctionne comme un charme tho!if (blah) { ... }
) ou quelque chose?Quelque chose comme ça devrait faire l'affaire.
la source
+new Date()
pournew Date().getTime()
car il est plus rapide: jsperf.com/date-vs-gettimeNon. Vous devrez l'annuler (
clearTimeout
), mesurer le temps écoulé depuis que vous l'avez démarré et le redémarrer avec la nouvelle heure.la source
Une version légèrement modifiée de la réponse de Tim Downs . Cependant, depuis que Tim a annulé ma modification, je dois répondre moi-même. Ma solution permet d'utiliser extra
arguments
comme troisième paramètre (3, 4, 5 ...) et d'effacer le timer:Comme Tim l'a mentionné, les paramètres supplémentaires ne sont pas disponibles dans
IE lt 9
, mais j'ai travaillé un peu pour que cela fonctionne dansoldIE
les.Usage:
new Timer(Function, Number, arg1, arg2, arg3...)
la source
"Pause" et "reprendre" n'ont pas vraiment beaucoup de sens dans le contexte de
setTimeout
, ce qui est une chose ponctuelle . Voulez-vous diresetInterval
? Si tel est le cas, non, vous ne pouvez pas le mettre en pause, vous pouvez seulement l'annuler (clearInterval
) et le reprogrammer à nouveau. Détails de tout cela dans la section Minuteries de la spécification.la source
Le délai d'attente était assez facile pour trouver une solution, mais l'intervalle était un peu plus délicat.
J'ai proposé les deux classes suivantes pour résoudre ces problèmes:
Ceux-ci peuvent être mis en œuvre comme tels:
Cet exemple définira un délai d'attente (pt_hey) qui est programmé pour alerter, "hey" après deux secondes. Un autre Timeout met pt_hey en pause après une seconde. Un troisième Timeout reprend pt_hey après deux secondes. pt_hey s'exécute pendant une seconde, fait une pause d'une seconde, puis reprend son exécution. pt_hey se déclenche après trois secondes.
Maintenant pour les intervalles plus délicats
Cet exemple définit un intervalle de pause (pi_hey) pour écrire "hello world" dans la console toutes les deux secondes. Un timeout met pi_hey en pause après cinq secondes. Un autre délai d'expiration reprend pi_hey après six secondes. Ainsi pi_hey se déclenchera deux fois, fonctionnera pendant une seconde, marquera une pause d'une seconde, fonctionnera pendant une seconde, puis continuera à déclencher toutes les 2 secondes.
AUTRES FONCTIONS
clearTimeout () et clearInterval ()
pt_hey.clearTimeout();
etpi_hey.clearInterval();
servent de moyen facile d'effacer les délais et les intervalles.getTimeLeft ()
pt_hey.getTimeLeft();
etpi_hey.getTimeLeft();
renverra le nombre de millisecondes jusqu'à ce que le prochain déclencheur se produise.la source
setInterval
? Je pense qu'un simpleif(!true) return;
fera l'affaire, ou ai-je tort?J'avais besoin de calculer le temps écoulé et restant pour afficher une barre de progression. Ce n'était pas facile d'utiliser la réponse acceptée. «setInterval» est meilleur que «setTimeout» pour cette tâche. J'ai donc créé cette classe Timer que vous pouvez utiliser dans n'importe quel projet.
https://jsfiddle.net/ashraffayad/t0mmv853/
la source
/relancer
Version ES6 utilisant le sucre syntaxique Class-y 💋
(légèrement modifié: ajout de start ())
la source
Vous pouvez consulter clearTimeout ()
ou pause selon une variable globale qui est définie lorsqu'une certaine condition est atteinte. Comme un bouton est enfoncé.
la source
Vous pouvez également l'implémenter avec des événements.
Au lieu de calculer le décalage horaire, vous démarrez et arrêtez d'écouter un événement 'tick' qui continue de s'exécuter en arrière-plan:
la source
Si vous utilisez de toute façon jquery, consultez le $ .doTimeout plugin . Cette chose est une énorme amélioration par rapport à setTimeout, notamment en vous permettant de suivre vos délais d'expiration avec un seul identifiant de chaîne que vous spécifiez et qui ne change pas à chaque fois que vous le définissez, et implémentez une annulation facile, des boucles d'interrogation et un débouncing, et plus. Un de mes plugins jquery les plus utilisés.
Malheureusement, il ne prend pas en charge la pause / reprise hors de la boîte. Pour cela, vous devrez encapsuler ou étendre $ .doTimeout, vraisemblablement de la même manière que la réponse acceptée.
la source
J'avais besoin de pouvoir mettre en pause setTimeout () pour la fonction de type diaporama.
Voici ma propre implémentation d'une minuterie en pause. Il intègre des commentaires vus sur la réponse de Tim Down, tels qu'une meilleure pause (commentaire du noyau) et une forme de prototypage (commentaire d'Umur Gedik).
Exemple:
Pour tester le code, utilisez
timer.resume()
ettimer.pause()
plusieurs fois et vérifiez combien de temps il reste. (Assurez-vous que votre console est ouverte.)Utiliser cet objet à la place de setTimeout () est aussi simple que de le remplacer
timerID = setTimeout( mycallback, 1000)
partimer = new Timer( mycallback, 1000 )
. Alorstimer.pause()
ettimer.resume()
sont à votre disposition.la source
Démo de travail "async" sur: site zarsoft.info
la source
Implémentation typographique basée sur la réponse la mieux notée
la source
Vous pouvez faire comme ci-dessous pour rendre setTimeout en pause côté serveur (Node.js)
et vous pouvez le vérifier comme ci-dessous
la source
Je ne pense pas que vous trouverez quelque chose de mieux que clearTimeout . Quoi qu'il en soit, vous pouvez toujours planifier un autre délai d'attente plus tard, au lieu de le «reprendre».
la source
Si vous avez plusieurs div à masquer, vous pouvez utiliser un
setInterval
et un certain nombre de cycles pour faire comme dans:la source