ordre d'exécution Javascript avec setTimeout ()
-
27-10-2019 - |
Question
Dites que j'ai le code suivant:
function testA {
setTimeout('testB()', 1000);
doLong();
}
function testB {
doSomething();
}
function doLong() {
//takes a few seconds to do something
}
J'exécute testA()
. J'ai lu que Javascript est mono-thread. Qu'est-ce qui se passe après 1000 millisecondes, lorsque le délai d'attente pour testB()
est atteint?
Quelques possibilités que je peux penser:
-
testB()
est mis en attente jusqu'à exécuter aprèsdoLong()
et tout ce qu'il a appelé ont fini. -
doLong()
est immédiatement terminée ettestB()
est démarré. -
doLong()
est donné un peu plus de temps à exécuter avant d'être arrêté (soit automatiquement, soit demander à l'utilisateur) ettestB()
est démarré. -
doLong()
est en pause,testB()
démarre. AprèstestB()
terminée,doLong()
reprend.
Quelle est la bonne réponse? Est-il dépendant de la mise en œuvre ou d'une partie de la norme? *
Cette question est similaire, mais pas la même chose, pour autant que je peux dire .
Tous les liens que vous pouvez recommander pour une meilleure compréhension exécution Javascript serait apprécié.
Merci!
* Oui, je sais que tous les navigateurs sont conformes aux normes: (
La solution
La première de vos suppositions est correcte:
testB() is queued up to execute after doLong() and anything else it called have finished.
Si cela prend plus d'une seconde pour testA
à la fin, testB
simplement attendre.
En outre, vous devriez écrire setTimeout(testB, 1000)
plutôt que setTimeout('testB()', 1000)
. Envoi d'une chaîne à setTimeout est, comme l'utilisation de eval
, mal généralement considéré et vous faire des ennemis;)