web-dev-qa-db-fra.com

Quel est l'équivalent de Thread.sleep () de Java en JavaScript?

Quel est l'équivalent de Thread.sleep() en JavaScript de Java?

158
Niger

La réponse simple est qu'il n'y a pas une telle fonction.

La chose la plus proche que vous avez est:

var millisecondsToWait = 500;
setTimeout(function() {
    // Whatever you want to do after the wait
}, millisecondsToWait);

Notez que vous en particulier ne voulez pas être occupé-attendre (par exemple dans une boucle de rotation), car votre navigateur exécute presque certainement votre JavaScript dans un seul environnement threadé.

Voici quelques autres SO questions concernant les thèmes en JavaScript:

Et cette question peut aussi être utile:

190
Daniel Pryden

Essayez avec ce code. J'espère que cela vous sera utile.

function sleep(seconds) 
{
  var e = new Date().getTime() + (seconds * 1000);
  while (new Date().getTime() <= e) {}
}
61
David Miró

En supposant que vous puissiez utiliser ECMAScript 2017, vous pouvez émuler un comportement similaire en utilisant async/wait et setTimeout. Voici un exemple de fonction de sommeil:

async function sleep(msec) {
    return new Promise(resolve => setTimeout(resolve, msec));
}

Vous pouvez ensuite utiliser la fonction de veille dans n’importe quelle autre fonction async comme celle-ci:

async function testSleep() {
    console.log("Waiting for 1 second...");
    await sleep(1000);
    console.log("Waiting done."); // Called 1 second after the first console.log
}

C'est bien parce que cela évite d'avoir besoin d'un rappel. L'inconvénient est qu'il ne peut être utilisé que dans des fonctions asynchrones. En coulisse, la fonction testSleep est suspendue et reprend une fois le sommeil terminé.

De MDN:

L'expression wait fait que l'exécution de la fonction asynchrone est suspendue jusqu'à ce qu'une promesse soit remplie ou rejetée, et qu'elle reprenne l'exécution de la fonction asynchrone après son exécution.

Pour une explication complète, voir:

18
Richrd

Il n'y a pas d'équivalent direct, car cela mettrait une page Web en pause. Cependant, il existe un setTimeout () , par exemple:

function doSomething() {
  thing = thing + 1;
  setTimeout(doSomething, 500);
}

Exemple de fermeture (merci Daniel):

function doSomething(val) {
  thing = thing + 1;
  setTimeout(function() { doSomething(val) }, 500);
}

Le deuxième argument est en millisecondes avant le déclenchement, vous pouvez l'utiliser pour des événements temporels ou attendre avant d'effectuer une opération.

Edit: Mis à jour en fonction des commentaires pour un résultat plus propre.

7
Nick Craver

Vous pouvez soit écrire une boucle de spin (une boucle qui boucle simplement pendant une longue période en effectuant une sorte de calcul pour retarder la fonction) ou utiliser:

setTimeout("Func1()", 3000);

Cela appellera 'Func1 ()' après 3 secondes.

Modifier:

Le mérite revient aux commentateurs, mais vous pouvez transmettre des fonctions anonymes à setTimeout.

setTimeout(function() {
   //Do some stuff here
}, 3000);

Ceci est beaucoup plus efficace et n’invoque pas la fonction eval de javascript.

4
Malaxeur

Pour la meilleure solution, utilisez async/wait statement pour le script ecma 2017

wait ne peut utiliser qu'à l'intérieur de la fonction async.

function sleep(time) {
    return new Promise((resolve) => {
        setTimeout(resolve, time || 1000);
    });
}

await sleep(10000); //this method wait for 10 sec.

Remarque: async/attend pas de thread réellement arrêté comme Thread.sleep mais simulez-le

3
Toprak

setTimeout ne tient pas et ne reprend pas sur votre propre thread, mais Thread.sleep le fait. Il n'y a pas d'égale réelle en Javascript

2
Eranga

Ou peut-être pouvez-vous utiliser la fonction setInterval pour appeler une fonction particulière après le nombre de millisecondes spécifié. Il suffit de faire un google pour le prototype setInterval.Je ne me souviens pas très bien.

0
The Machine