Maison  >  Questions et réponses  >  le corps du texte

javascript - À propos du mécanisme d'exécution de setInterval

//Mise à jour : Cette question n'a pas de valeur de référence et est un peu déroutante. Elle a été fermée. Pour plus de détails, veuillez consulter ma réponse ci-dessous

J'ai vu un blog mentionné il y a deux jours : Si le temps d'exécution de la fonction de rappel setInterval est supérieur au délai spécifié, lorsque le timer est déclenché, si la file d'attente des tâches a une fonction de rappel pour le même timer, alors ce rappel sera Ignoré, ce qui signifie qu'il n'y aura pas deux ou plusieurs fonctions de rappel du même minuteur dans la file d'attente des tâches. L'énoncé n'est pas clair, il suffit de regarder le code :

Exemple 1

(function(){
    var j=1;
    var start=new Date().getTime();
    var timr=setInterval(function(){
        console.log("第"+j+"次定时器开始时间:"+(new Date().getTime()-start));
        for(var i=0;i<5000;i++){console.log("")};
        console.log("第"+j+"次定时器结束时间:"+(new Date().getTime()-start));
        j++;
    },100);
    setTimeout(function(){
        clearInterval(timr)
    },1000)
})()

setInterval ajoute une fonction à la file d'attente des tâches toutes les 100 ms et setInterval est effacé après 1000 ms. Expliquez ce résultat selon l'énoncé ci-dessus :

  1. Mettez la première boucle for dans la file d'attente des tâches à 100 ms, et le thread principal inactif commence à exécuter cette boucle, ce qui prend 863 ms ;

  2. Pendant l'exécution de la première boucle for, le deuxième minuteur est déclenché à 200 ms, et la seconde boucle for est placée dans la file d'attente des tâches vide jusqu'à ce que le thread principal soit inactif et commence à exécuter la seconde boucle for après 964 ms ;
  3. Lorsque le minuteur (numéro de séquence théorique) est déclenché de la troisième à la huitième fois, le thread principal exécute la première boucle for, et il y a une seconde boucle for dans la file d'attente des tâches, donc ces fonctions sont ignorées et la tâche n'est pas entré dans la file d'attente ;

  4. À 900 ms, le neuvième minuteur est déclenché et le thread principal exécute la deuxième boucle for. La fonction de ce minuteur n'existe pas dans la file d'attente des tâches, donc la fonction de ce minuteur est mise dans la file d'attente des tâches, ce qui est. le résultat. "3ème minuteur" ;
  5. À 1000 ms, le dixième timer est déclenché, mais est ignoré pour la même raison que le troisième, puis setInterval est effacé.

  6. Exemple 2

  7. Mais le résultat d'un autre exemple de test n'est pas comme ça
  8. for(var i=0;i<10000;i++){
        console.log(1)
    }
    setInterval(function(){
        console.log("定时器")
    },1000)

    Le navigateur exécute d'abord la boucle for, ce qui a pris environ 13 secondes sur mon ordinateur (l'ordinateur est tellement mauvais... D'après la déclaration ci-dessus, pendant ces 13 secondes, il n'y aura qu'une seule fonction de ce timer dans le fichier). file d'attente des tâches. Ensuite, le résultat de l'exécution est d'imprimer 13 "minuteries" en même temps après 13 secondes, puis d'exécuter la fonction dans une période d'une seconde.

  9. Question

Les deux exemples ci-dessus sont contradictoires. Comment fonctionne setInterval dans ce cas ? J'espère pouvoir vous donner une réponse claire, de préférence avec des informations faisant autorité. Merci Dakar.

过去多啦不再A梦过去多啦不再A梦2734 Il y a quelques jours641

répondre à tous(2)je répondrai

  • PHP中文网

    PHP中文网2017-05-19 10:37:06

    J'ai posé cette question, mais maintenant je me sens un peu confuse. . .
    Dans le deuxième exemple, le thread js a été occupé lors de l'exécution de la boucle for et l'instruction suivante n'a pas été analysée, c'est-à-dire que le timer n'a pas été enregistré. Modifiez l'exemple et ajoutez le temps d'exécution :

    var start=new Date().getTime();
    for(var i=0;i<10000;i++){
        console.log(1)
    }
    console.log("耗时"+(new Date().getTime()-start))
    setInterval(function(){
        console.log("定时器"+(new Date().getTime()-start))
    },1000)

    Ce sera très clair lorsque vous utiliserez cet exemple pour tester. La boucle for ci-dessus s'est exécutée pendant environ 1544 ms. À ce moment-là, le thread js a analysé l'instruction, le minuteur a été enregistré, puis exécuté normalement.

    Il n'y a donc pas de conflit entre les deux exemples. Le premier exemple est correct. Lorsque le thread principal exécute la fonction timer et que la file d'attente des tâches a la même fonction timer, pendant cette période, le timer Tous les déclencheurs sont ignorés. .

    répondre
    0
  • 巴扎黑

    巴扎黑2017-05-19 10:37:06

    Cependant, L'exemple 2 pour setInterval n'a pas été exécuté avant la fin

    répondre
    0
  • Annulerrépondre