147 votes

JQuery : Attendre/Délai d'une seconde sans exécuter de code

Je n'arrive pas à faire fonctionner la méthode .delay en jQuery :

$.delay(3000); // ne fonctionne pas
$(queue).delay(3000); // ne fonctionne pas

Je suis en train d'utiliser une boucle while pour attendre qu'une valeur changeante non contrôlée soit supérieure ou égale à une autre et je ne trouve aucun moyen d'interrompre l'exécution pendant X secondes.

0 votes

Essayez d'utiliser setTimeout dans le callback

0 votes

Quelle version de jQuery utilisez-vous ?

1 votes

Ce n'est pas pour ça que la fonction de délai est conçue, elle est conçue pour être utilisée entre les événements jQuery en attente (comme fade().delay().show()). Vous avez besoin de la fonction setTimeOut.

239voto

Matt Sich Points 587

Vous pouvez également simplement retarder une opération de cette manière :

setTimeout(function (){

  // Quelque chose que vous voulez retarder.

}, 5000); // Combien de temps vous voulez que le retard soit, mesuré en millisecondes.

8 votes

Juste une information, cela ne casse pas le flux d'exécution, donc si vous avez besoin de "tout arrêter" pendant quelques secondes, vous aurez besoin de quelque chose comme ce que Niessner a posté.

0 votes

Oui... c'est un rappel à la fonction et ne bloque pas. Merci pour la réponse, cela a résolu mon problème.

0 votes

Si la fréquence est extrêmement courte et que nous nous attendons à ce que cette fonction s'exécute indéfiniment, finira-t-elle par remplir la pile ?

189voto

Justin Niessner Points 144953

$.delay est utilisé pour retarder les animations dans une file d'attente, pas pour arrêter l'exécution.

Au lieu d'utiliser une boucle while, vous devez appeler de manière récursive une méthode qui effectue la vérification chaque seconde en utilisant setTimeout:

var check = function(){
    if(condition){
        // s'exécute lorsque la condition est remplie
    }
    else {
        setTimeout(check, 1000); // vérifier à nouveau dans une seconde
    }
}

check();

1 votes

Je pense que setTimeout est suffisant.

3 votes

Vous êtes au top, mec, c'est exactement ce dont j'avais besoin pour corriger mon code.

0 votes

@Jiemurat et toute personne dans le futur: setTimeout ne casse pas le flux d'exécution. Le super code de Niessner obtient cela jusqu'à ce que les conditions deviennent vraies!

10voto

Julian D. Points 4235

La fonction delay de jQuery est destinée à être utilisée avec des effets et des files d'attente d'effets, consultez la documentation de delay ainsi que l'exemple ci-dessous :

$('#foo').slideUp(300).delay(800).fadeIn(400);

Si vous souhaitez observer une variable pour détecter des changements, vous pourriez faire quelque chose comme

(function() {
    var observerInterval = setInterval(function() {
        if (/* vérifiez les changements ici */) {
           clearInterval(observerInterval);
           // faites quelque chose ici
        }
    }, 1000);
})();

0 votes

SetInterval a un deuxième paramètre obligatoire, le temps en millisecondes ;)

1 votes

Merci @sara.potyscki, corrigé.

0 votes

@JulianD. Merci pour cette suggestion. Je suis tombé sur cette question en cherchant une solution sur Google. C'est exactement ce dont j'avais besoin pour mon projet.

8voto

Jay Tomten Points 634

JavaScript setTimeout est une très bonne solution :

function funcx()
   {
   // votre code ici
   // sortir d'ici si nécessaire
   setTimeout(funcx, 3000);
   }

funcx();

La fonction delay dans jQuery est principalement utilisée pour retarder les animations dans une file d'attente d'animation jQuery.

6voto

Nathan MacInnes Points 6749

delay() ne bloque pas le flux du code puis le relance. Il n'y a pas de moyen pratique de le faire en JavaScript. Tout doit être fait avec des fonctions qui prennent des rappels comme setTimeout comme d'autres l'ont mentionné.

Le but de delay() de jQuery est de faire attendre une file d'attente d'animation avant de s'exécuter. Par exemple, $(élément).delay(3000).fadeIn(250); fera apparaître l'élément en fondu après 3 secondes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X