100 votes

Comment implémenter un verrou en JavaScript

Comment quelque chose d'équivalent à lock en C# être implémenté en JavaScript?

Donc, pour expliquer ce que je pense, un cas d'utilisation simple:

L'utilisateur clique sur le bouton B. B soulève un événement onclick. Si B est event-state l'événement attend B d'être ready-state avant de se propager. Si B est ready-state, B est verrouillé et qu'il est défini à l' event-state, alors l'événement se propage. Lorsque l'événement est de propagation est complet, B est définie à l' ready-state.

J'ai pu voir comment quelque chose de proche de ce qui peut être fait simplement en ajoutant et en supprimant la classe ready-state depuis le bouton. Cependant, le problème est que l'utilisateur peut cliquer sur un bouton deux fois de suite, plus vite que la variable peut être définie, de sorte que cette tentative de verrouillage va échouer dans certaines circonstances.

Personne ne sait comment mettre en œuvre un verrou qui ne manquera pas d'en JavaScript?

92voto

JoshRivers Points 2902

Le verrouillage est une idée discutable dans JS qui est conçue pour être sans thread et ne nécessitant pas de protection contre la concurrence. Vous souhaitez combiner des appels en exécution différée. Le modèle que je suis pour cela est l'utilisation de rappels. Quelque chose comme ça:

 var functionLock = false;
var functionCallbacks = [];
var lockingFunction = function (callback) {
    if (functionLock) {
        functionCallbacks.push(callback);
    } else {
        $.longRunning(function(response) {
             while(functionCallbacks.length){
                 var thisCallback = functionCallbacks.pop();
                 thisCallback(response);
             }
        });
    }
}
 

Vous pouvez également l'implémenter à l'aide d'écouteurs d'événements DOM ou d'une solution pubsub .

40voto

Mike Samuel Points 54712

JavaScript est, à quelques rares exceptions près ( XMLHttpRequest onreadystatechange gestionnaires dans certaines versions de Firefox) en mode simultané . Vous n'avez donc pas à vous soucier de verrouiller dans ce cas.

6voto

James Westgate Points 6789

Les serrures sont un concept requis dans un système multithread. Même avec les threads de travail, les messages sont envoyés par valeur entre les travailleurs, ce qui rend le verrouillage inutile.

Je suppose que vous devez simplement définir un sémaphore (système de signalisation) entre vos boutons.

1voto

Ravia Points 4797

Pourquoi ne désactivez-vous pas le bouton et ne l'activez-vous pas une fois l'événement terminé?

 <input type="button" id="xx" onclick="checkEnableSubmit('true');yourFunction();">

<script type="text/javascript">

function checkEnableSubmit(status) {  
  document.getElementById("xx").disabled = status;
}

function yourFunction(){

//add your functionality

checkEnableSubmit('false');
}

</script>
 

Bonne codage !!!

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