En évitant le dialogue "script est trop long", dois-je diviser ma fonction et l'exécuter à intervalles?

J'ai une très grande JavasScript pour la boucle en cours d'exécution sur l'une de mes pages. Il est tellement important qu'il provoque un popup IE dans les anciennes versions qui dit quelque chose comme: 'Un script de cette page fait fonctionner lentement, voulez-vous terminer?'

Je suis convaincu que je l'ai optimisé autant que possible, alors maintenant je cherche des moyens alternatifs pour le faire.

Je me demande s'il serait bénéfique pour moi de créer un intervalle qui a exécuté les 100 premières itérations, puis les 100 premières itérations, puis la troisième et ainsi de suite jusqu'à ce que toutes les itérations soient terminées? Est-ce que cela empêcherait le popup de l'IE de prétendre que les scripts fonctionnent trop lentement?

Le popup du navigateur "script too long" apparaîtra à chaque fois que votre code ne renverra pas le contrôle à la boucle de traitement des événements principaux du navigateur assez rapidement.

L'utilisation de setTimeout comme vous suggérez dans la question pour déclencher vos calculs en lots empêcherait le popup d'apparaître.

Le retour à la boucle de l'événement périodiquement permettra également au navigateur de rester réceptif à d'autres événements UI – vous pourriez (par exemple) proposer un bouton "annuler". Je vous suggère d'essayer de produire au moins une fois par seconde, sinon un peu plus fréquemment que cela.

Javascript est simple, ce qui constitue l'obstacle principal.

Si vous souhaitez effectuer beaucoup de calculs, de préférence, vous devriez utiliser les travailleurs , mais ceux-ci ne sont supportés que par des navigateurs modernes. Ceci pour que vos calculs ne ralentissent pas l'interface utilisateur, ce qui devrait être dans le thread principal. C'est une pratique courante lors de la création d'applications de bureau.

Le fractionnement du calcul pourrait être une bonne idée si vous ne vous dérangez pas de prendre beaucoup plus de temps qu'il le devrait. Cela devrait éviter que le popup n'apparaisse, pourvu que vous ayez l'heure.

Vous devriez peut-être reconsidérer la nécessité d'effectuer tant de calculs du côté client.

Vous pourriez utiliser ceci: multithreading . Ce n'est pas vraiment multithreading, c'est jouer avec des minuteries. Cela empêchera le popup. Mais je ne sais pas si cela est nécessaire dans ce cas, sauf si vous faites un jeu complet.