Maison >interface Web >js tutoriel >Pourquoi ma fonction setTimeout() s'exécute-t-elle immédiatement, malgré la définition d'un délai ?
Exécution retardée des appels de fonction avec setTimeout
En JavaScript, utiliser setTimeout() pour planifier l'exécution d'une fonction à une date ultérieure est une technique courante pour la programmation asynchrone. Cependant, il existe des cas où la fonction est exécutée immédiatement même si elle a été planifiée avec un retard. Comprendre les subtilités de setTimeout() est crucial pour une exécution asynchrone efficace.
Dans le contexte fourni, la fonction crawl() est destinée à appeler la fonction doRequest() à des intervalles d'environ 10 secondes. Cependant, la fonction est exécutée immédiatement.
La clé pour comprendre ce problème réside dans la syntaxe de setTimeout(). Lorsque vous fournissez une fonction en tant que paramètre, il est important de spécifier la fonction elle-même, suivie du délai, puis de tous les arguments requis par la fonction.
Solutions possibles :
Fonction, délai et arguments :
Appelez setTimeout() de la manière suivante :
setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
Cela garantit que doRequest() est passé comme fonction à exécuter, avec le délai et les arguments nécessaires.
Fonction as String :
Alternativement, vous pouvez passer doRequest () comme chaîne qui sera évaluée :
setTimeout('doRequest('+url+','+proxys[proxy]+')', proxytimeout);
Cette approche nécessite moins de parenthèses et offre une alternative plus concise.
Fonction anonyme avec fermeture :
Enfermez doRequest() dans une fonction anonyme pour empêcher les changements d'arguments dans la boucle :
(function(u, p, t) { setTimeout(function() { doRequest(u, p); }, t); })(url, proxys[proxy], proxytimeout);
Cette technique garantit que les variables utilisées dans la fermeture restent cohérentes, même si la boucle progresse. Cependant, elle est légèrement plus complexe que les options précédentes.
En fonction de vos besoins spécifiques, chacune de ces solutions planifiera efficacement l'exécution de doRequest() avec le délai prévu. Comprendre les nuances de setTimeout() est essentiel pour réussir une programmation asynchrone en JavaScript.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!