trouver le temps de la gauche dans un setTimeout()?
Je suis en train d'écrire du Javascript qui interagit avec code de bibliothèque que je ne possède pas, et ne peut (raisonnablement) le changement. Il crée Javascript délais d'attente utilisé pour l'affichage de la question suivante dans une série de questions limitées. Ce n'est pas vraiment de code car il est dissimulé au-delà de toute espérance. Voici ce que la bibliothèque est en train de faire:
....
//setup a timeout to go to the next question based on user-supplied time
var t = questionTime * 1000
test.currentTimeout = setTimeout( showNextQuestion(questions[i+1]), t );
Je veux mettre une barre de progression à l'écran qui remplit vers questionTime * 1000
en interrogeant le minuteur créé par setTimeout
. Le seul problème est, il semble y avoir aucun moyen de le faire. Est-il un getTimeout
fonction que je suis absent? La seule information sur Javascript délais d'attente que je peux trouver est liée uniquement à la création via setTimeout( function, time)
et de suppression via clearTimeout( id )
.
Je suis à la recherche d'une fonction qui retourne le temps restant avant un délai d'attente des incendies, ou le temps écoulé après un délai d'attente a été appelé. Ma barre de progression de code ressemble à ceci:
var timeleft = getTimeout( test.currentTimeout ); //I don't know how to do this
var $bar = $('.control .bar');
while ( timeleft > 1 ) {
$bar.width(timeleft / test.defaultQuestionTime * 1000);
}
tl;dr: Comment puis-je trouver le temps restant avant un javascript setTimeout()?
Voici la solution que j'utilise maintenant. Je suis passé par la section de la bibliothèque qui est en charge de tests, et en clair le code (terrible, et contre ma autorisations).
//setup a timeout to go to the next question based on user-supplied time
var t = questionTime * 1000
test.currentTimeout = mySetTimeout( showNextQuestion(questions[i+1]), t );
et voici mon code:
//wrapper pour setTimeout fonction mySetTimeout( func, délai d'attente ) { délais d'attente[ n = setTimeout( func, délai d'attente ) ] = { départ: new Date().getTime(), fin: new Date().getTime() + délai d'attente t: délai d'attente } return n; }
Cela fonctionne assez localisé dans n'importe quel navigateur qui n'est pas IE 6. Même l'iPhone original, où j'ai attendu que les choses se asynchrone.
Vous devez vous connecter pour publier un commentaire.
Si vous ne pouvez pas modifier le code de la bibliothèque, vous aurez besoin de redéfinir setTimeout pour répondre à vos fins. Voici un exemple de ce que vous pourriez faire:
Ce n'est pas le code de production, mais il devrait vous mettre sur la bonne voie. Notez que vous ne pouvez lier un port d'écoute par timeout. Je n'ai pas fait de nombreux essais avec cela, mais il fonctionne dans Firebug.
Une solution plus robuste serait d'utiliser la même technique d'emballage setTimeout, mais au lieu d'utiliser une carte de l'retourné timeoutId aux auditeurs de gérer plusieurs auditeurs par timeout. Vous pourriez aussi envisager d'emballage clearTimeout de sorte que vous pouvez détacher votre écoute si le délai d'attente est désactivée.
Juste pour mémoire, il y a un moyen d'obtenir le temps node.js:
Imprime:
Cela ne semble pas fonctionner dans firefox, mais depuis node.js est javascript, j'ai pensé que cette remarque pourrait être utile pour les personnes à la recherche pour le nœud de la solution.
getTime()
est supprimé,_idleStart
est déjà le tempsEDIT: en fait, je pense que j'ai fait une bien meilleure: https://stackoverflow.com/a/36389263/2378102
J'ai écrit cette fonction et je l'utilise beaucoup:
Faire un timer:
Donc, si vous voulez le temps qui reste juste à faire:
Javascript de l'événement piles ne fonctionnent pas de la façon dont vous pensez.
Lorsqu'un délai d'attente d'événement est créé, il est ajouté à la file d'attente des événements, mais d'autres évènements peuvent avoir la priorité alors que l'événement est déclenché, le retard le temps d'exécution et le report de l'exécution.
Exemple: Vous créez un délai d'attente avec un retard de 10 secondes pour avertir de quelque chose à l'écran. Il sera ajouté à la pile d'événements et sera exécuté après tous les événements sont déclenchés (à l'origine de certaines de retard). Puis, lorsque le délai d'attente est traitée, le navigateur continue à capturer d'autres événements à ajouter à la pile, ce qui provoque d'autres retards dans le traitement. Si l'utilisateur clique, ou fait beaucoup de ctrl+de frappe, de leurs événements, prendre la priorité sur la pile actuelle. Votre 10 secondes peut se transformer en 15 secondes ou plus.
Cela étant dit, il ya beaucoup de façons de faux combien de temps a passé. Une façon est d'exécuter un setInterval juste après l'ajout de la setTimeout à la pile.
Exemple: Effectuer un settimeout avec une temporisation de 10 secondes (magasin de retard au niveau mondial). Effectuez ensuite un setInterval qui s'exécute à chaque seconde de soustraire 1 de la temporisation de sortie et le délai restant. En raison de la façon dont la pile d'événements peuvent influencer temps réel (décrit ci-dessus), c'est encore de ne pas être précis, mais donne un nombre.
En bref, il n'y a pas de véritable moyen d'obtenir le reste du temps. Il y a seulement des moyens pour essayer de donner une estimation de l'utilisateur.
Ici est peut-être une meilleure façon de le faire, en plus, vous n'aurez pas besoin de changer le code que vous avez déjà écrit:
... Et mimimized:
Côté serveur Node.js spécifique
Aucune de vraiment fonctionné pour moi, et après avoir inspecté le délai d'expiration de l'objet, il ressemblait à tout ce qui était relatif lorsque le processus a commencé. Le suivant a fonctionné pour moi:
De sortie:
Édité sortie pour des raisons de concision, mais cette fonction de base donne un temps approximatif jusqu'à l'exécution ou depuis l'exécution. Comme d'autres mentionnent, rien de tout cela va être exact, en raison de la manière, node processus, mais si je veux supprimer une demande qui a été exécuté en moins de 1 minute auparavant, et j'ai stocké le timer, je ne vois pas pourquoi cela ne fonctionnerait pas comme une vérification rapide. Pourrait être intéressant de jongler avec des objets avec refreshtimer 10.2+.
Non, mais vous pouvez avoir votre propre setTimeout/setInterval pour l'animation dans votre fonction.
Dire à votre question ressemble à ceci:
Et votre animation sera assurée par ces 2 fonctions:
Si quelqu'un est à la recherche de retour sur ce. Je suis venu avec un délai d'attente et l'intervalle de manager que vous pouvez obtenir le temps laissé un délai d'attente ou de l'intervalle ainsi que de faire quelques autres trucs. Je vais être en ajoutant de la rendre plus astucieux et plus précis, mais il semble fonctionner assez bien, comme c'est (bien que j'ai quelques autres idées pour le rendre encore plus précis):
https://github.com/vhmth/Tock
Question a déjà été répondu, mais je vais ajouter ma pierre. Il juste de se dérouler pour moi.
Utilisation
setTimeout
dansrecursion
comme suit:Je suppose que le code est auto-explicatif
Vérifier celui-ci:
Faire un timer:
Obtenir demeurent:
Clair délai
Je me suis arrêté ici à la recherche pour cette réponse, mais a été avoir à y penser mon problème. Si vous êtes ici parce que vous avez juste besoin de garder une trace du temps alors que vous êtes setTimeout est en cours, voici une autre façon de faire:
Vous pouvez modifier
setTimeout
pour stocker chaque délai d'attente de la fin des temps dans une carte et de créer une fonction appeléegetTimeout
pour obtenir le temps laissé à un délai d'attente avec une certaine id.C'était super's solution, mais je l'ai modifié pour utiliser un peu moins de mémoire
Utilisation:
Voici une version compacte de cette
getTimeout
IIFE:J'espère que cela est utile pour vous comme pour moi! 🙂