2016-03-21 1 views
4

J'ai deux fonctions, d'abord on choisit des choses et l'autre, il évalue avec un retard, comme celui-ci:Javascript pause - désactiver une fonction jusqu'à ce qu'une autre un se termine

function select() { 
    // selecting stuff 
    window.setTimeout(evaluate, 1000); 
} 
function evaluate() { 
    // evaluating stuff 
} 

La question est, la fonction de sélection devrait être désactivé jusqu'à la fin de la seconde. Je sais qu'il est impossible d'arrêter complètement Javascript, mais la première fonction qui se déclenche pendant que l'autre attend ou travaille sérieusement gâche tout. J'ai déjà essayé de déplacer le code vers d'autres fonctions et de les retarder, mais rien ne fonctionne.

Merci d'avance!

+0

https://api.jquery.com/jquery.when/ –

Répondre

1

Qui a dit que c'était impossible? Vous pouvez vérifier si le temporisateur est en cours d'exécution en enregistrant et en suivant son ID:

var timeout = null; 
function select() { 
    if(timeout) { // check if the timer ID is set 
     return; 
    } 
    // selecting stuff 
    timeout = window.setTimeout(evaluate, 1000); // return the ID of the timer 
} 
function evaluate() { 
    // evaluating stuff 
    window.clearTimeout(timeout); // clear the timer ID 
    timeout = null; // reset the timer ID 
} 
1

Je pense que ce problème devrait utiliser des rappels. Un rappel est une fonction à exécuter après l'exécution d'une autre fonction. De cette façon, vous garantissez que la fonction est exécutée après l'exécution de l'autre. Aussi, comment obtenez-vous des données? La plupart des fonctions SQL ont des fonctions de rappel, c'est-à-dire de succès, que vous pouvez utiliser pour appeler votre autre fonction. Vous pourriez vous retrouver dans l'appel de l'enfer, mais vous utilisez le rappel des autres fonctions pour continuer à traiter vos données.

Excellent article ici:

http://dreamerslab.com/blog/en/javascript-callbacks/

1

La bonne façon de gérer ce genre de situation est d'utiliser des promesses. Je préfère utiliser la bibliothèque Q (https://github.com/kriskowal/q), mais bien sûr, vous pouvez utiliser jquery aussi. Disons que vous voulez exécuter select, la course d'évaluer et de faire de sélection désactivées jusqu'à ce que l'évaluation se fait:

var deferred = jQuery.Deferred(); 

function select() { 
    if (deferred.state() === "pending") { 
     console.log("Evaluate not finished"); 
    } else { 
     // select stuff 
     evaluate(deferred.promise()); 
    } 
} 

function evaluate(promise) { 
    // evaluating stuff 
    promise.resolve(); 
}