web-dev-qa-db-fra.com

Fonction veille/retard/attente Javascript

Désolé si cette question a déjà été posée ici auparavant, je n'ai pas pu trouver de réponse appropriée.

Je souhaite créer une fonction JavaScript veille/retard/attente que je peux appeler n'importe où dans le script, comme la fonction .delay() de jQuery

Je ne suis pas en mesure d'utiliser setTimeout, car j'ai un script généré par php, et je ne suis donc pas en mesure de le mettre dans deux fonctions différentes, avec le délai d'attente au milieu. J'ai besoin de créer une fonction qui me permet de faire

alert("time started");
sleep(4000);
alert("time up");

Je vraiment ne veux pas utiliser jQuery.

15
user2704237

Malheureusement, vous ne pouvez pas simplement mettre une fonction en pause.

Vous devez utiliser setTimeout()

Exemple:

function startTimer () {
    timer.start();
    setTimeout(stopTimer,5000);
}

function stopTimer () {
    timer.stop();
}

MODIFIER:

Pour votre compte à rebours généré par l’utilisateur, c’est aussi simple. 

HTML:

<input type="number" id="delay" min="1" max="5">

JS: 

var delayInSeconds = parseInt(delay.value);
var delayInMilliseconds = delayInSeconds*1000;

function startTimer () {
    timer.start();
    setTimeout(stopTimer,delayInMilliseconds);
}

function stopTimer () {
    timer.stop;
}

Maintenant, vous devez simplement ajouter un déclencheur pour startTimer(), tel que onchange.

14
Deep

Vous devrez utiliser un setTimeout afin que je vois votre problème comme

J'ai un script généré par PHP et je ne peux donc pas le mettre dans deux fonctions différentes.

Qu'est-ce qui vous empêche de générer deux fonctions dans votre script?

function fizz() {
    var a;
    a = 'buzz';
    // sleep x desired
    a = 'complete';
}

Pourrait être réécrit comme

function foo() {
    var a; // variable raised so shared across functions below
    function bar() { // consider this to be start of fizz
        a = 'buzz';
        setTimeout(baz, x); // start wait
    } // code split here for timeout break
    function baz() { // after wait
        a = 'complete';
    } // end of fizz
    bar(); // start it
}

Vous remarquerez que a dans baz commence par buzz quand elle est invoquée et à la fin de l'invocation, a dans foo sera "complete".

Fondamentalement, tout envelopper dans une fonction, déplacer toutes les variables vers le haut dans cette fonction d'habillage de sorte que les fonctions contenues les héritent. Ensuite, chaque fois que vous rencontrez wait NUMBER seconds vous echo une setTimeout, fermez la fonction et démarrez une nouvelle fonction pour reprendre où vous vous êtes arrêté.

9
Paul S.

Le comportement exact à celui que vous avez spécifié est impossible dans JS tel qu’implémenté dans les navigateurs actuels. Pardon.

Eh bien, vous pourriez théoriquement créer une fonction avec une boucle dans laquelle la condition de fin de boucle serait basée sur le temps, mais cela encombrerait votre processeur, rendrait le navigateur inactif et rendrait la conception extrêmement médiocre. Je refuse même d'écrire un exemple pour cela;)


Update: Ma réponse a eu -1'd (injustement), mais je suppose que je pourrais mentionner cela dans ES6 (que n'est pas déjà implémenté dans les navigateurs, ni activé dans Node. js par défaut), il sera possible d’écrire un code asynchrone de manière synchrone. Vous auriez besoin de promesses et de générateurs pour cela.

Vous pouvez l'utiliser aujourd'hui, par exemple dans Node.js avec des drapeaux d'harmonie, à l'aide de Q.spawn (), voir cet article de blog par exemple (le dernier exemple est ici).

2
kamituel

Voici une solution utilisant la nouvelle syntaxe async/wait.

async function testWait() {
    alert('going to wait for 5 second');
    await wait(5000);
    alert('finally wait is over');
}

function wait(time) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve();
        }, time);
    });
}

Remarque: Vous pouvez appeler la fonction wait uniquement dans les fonctions asynchrones

1
Anil Agrawal

Vous pouvez utiliser ceci -

function sleep(milliseconds) {
    var start = new Date().getTime();
    for (var i = 0; i < 1e7; i++) {
        if ((new Date().getTime() - start) > milliseconds){
            break;
        }
    }
}
1
Tushar

Vous pouvez utiliser le code suivant, il effectue un appel récursif dans la fonction afin d'attendre correctement le temps souhaité.

function exportar(page,miliseconds,totalpages)
{
    if (page <= totalpages)
    {
        nextpage = page + 1;
        console.log('fnExcelReport('+ page +'); nextpage = '+ nextpage + '; miliseconds = '+ miliseconds + '; totalpages = '+ totalpages );
        fnExcelReport(page);
        setTimeout(function(){
            exportar(nextpage,miliseconds,totalpages);
        },miliseconds);
    };
}
0
Emi