web-dev-qa-db-fra.com

valeur de retour setInterval / setTimeout

Deux questions:

  1. Comment la valeur renvoyée par setInterval et setTimeout (celles utilisées pour effacer les temporisateurs) est-elle calculée?

  2. Est-il possible que les deux fonctions retournent la même valeur pendant l'exécution? Par exemple:

    var a = setInterval(fn1, 1000);
    var b = setTimeout(fn2, 1000);

Est-il possible que a et b aient la même valeur?

La première est davantage une question à ma connaissance, mais la seconde est plus importante.

38
aditya

Renvoie une valeur qui peut être utilisée pour annuler le temporisateur. Donc, il semblerait peu probable qu'ils retournent la même valeur (sauf s'ils réutilisent des valeurs et que l'un des temporisateurs a déjà été annulé)

Mozilla indique que c'est le DOM niveau 0, mais ne fait pas partie de la spécification. (regardez en bas de la page)

J'ai une référence encore meilleure:

Nabble dit:

SetTimeout et setInterval sont issus de la spécification Javascript d'origine, pré-ECMA. Cette spécification n'est officiellement standardisée nulle part, mais elle est prise en charge par tous les navigateurs Web et la plupart des implémentations du langage Javascript. (Y compris ActionScript.)

Les spécifications pré-ECMA sont souvent appelées API "DOM-0". Comme ils n'ont jamais été standardisés auparavant, il est logique que HTML5 spécifie enfin les API non obsolètes dans le but de fournir un environnement cohérent entre les navigateurs. Surtout lorsque les événements récents ont prouvé qu'il existe des entreprises qui aiment appliquer la lettre de la norme, mais pas l'esprit.

Lisez les spécifications originales ici , ou de Sun (qui était un des premiers endosseurs de JavaScript).

35
cgp

Testé sous Opera 9, Safari 3, Firefox 3 et IE 7.

Tous ont renvoyé des valeurs entières, commençant à 1, puis incrémentant de 1 pour chaque appel à setTimeOut() et setInterval(). Cependant, j'ai remarqué que les navigateurs ont démarré les compteurs et les ont traités différemment:

  • IE a commencé avec un nombre (apparemment) aléatoire à 6 chiffres, mais les appels ultérieurs à l'une ou l'autre fonction ont incrémenté ce nombre. Après avoir fermé et rouvert IE j'ai trouvé que le numéro de départ semblait être généré de manière aléatoire, car il était loin du décompte de la session précédente.
  • Opera a maintenu un compteur pour chaque onglet - la fermeture d'un onglet et l'ouverture d'un nouveau ont démarré le compteur à partir de 1 dans le nouvel onglet.
  • Dans Safari, le nombre était global - l'ouverture d'un nouvel onglet et l'appel des fonctions dans différents onglets semblaient incrémenter un compteur de référence global.
  • Dans Firefox, le compteur semblait commencer à 2 et incrémenté à chaque appel ultérieur à l'une ou l'autre fonction. Comme Opera, chaque onglet avait sa propre valeur de compteur, mais ils semblaient tous commencer à 2.

Notez cependant que dans tous les scénarios, il n'y a pas deux identifiants (au moins dans le même onglet) identiques.

32
Alex Rozanski

Je pense que ce n'est pas un comportement standardisé. Dans Firefox, c'est juste un entier, incrémentant à chaque appel de setTimeout ou setInterval. Et non, ils ne peuvent pas avoir la même valeur.

6

Depuis le site Web de Mozilla:

intervalID est un ID d'intervalle unique que vous pouvez transmettre à clearInterval ().

C'est donc unique :)

2
Ropstah

Qu'ils puissent avoir la même valeur dépend de l'implémentation JavaScript. Comme Maciej l'a mentionné dans Firefox, ils ne peuvent pas avoir la même valeur que le même compteur utilisé. Cependant, cela peut être différent dans d'autres navigateurs, il est donc préférable de ne pas compter sur eux qui n'ont jamais la même valeur.

1
Mario Menger

Il me semble que la valeur renvoyée est la valeur d'index pour la liste des minuteries/intervalles conservés en interne.

Comme au point, j'ai appelé clearInterval (18) au lieu de clearInterval (var_returned_from_set) et il a arrêté le temporisateur/intervalle souhaité. (Testé FF17.0.1 et IE9.0.8)

Dans mes propres tests, ils semblent également uniques pour la durée de vie de la page pour ces deux navigateurs.

0
Plater