Hier ist das Szenario:Vermeidung eines Javascript Race-Zustand
Meine Benutzer sind ein Raster, im Grunde genommen, eine abgespeckte Version einer Tabelle dargestellt. In jeder Zeile des Rasters befinden sich Textfelder. Wenn sie einen Wert in einem Textfeld ändern, führe ich eine Validierung ihrer Eingabe durch, aktualisiere die Sammlung, die das Raster steuert, und zeichne die Zwischensummen auf der Seite neu. Dies wird alles durch das OnChange-Ereignis jedes Textfelds behandelt.
Wenn sie auf die Schaltfläche "Speichern" klicken, verwende ich das OnClick-Ereignis der Schaltfläche, um eine abschließende Überprüfung der Beträge durchzuführen und dann ihre gesamten Eingaben an einen Webdienst zu senden und zu speichern.
Zumindest passiert das, wenn sie durch das Formular auf den Submit-Button klicken.
Das Problem ist, wenn sie einen Wert eingeben, klicken Sie sofort auf die Schaltfläche Speichern, SaveForm() startet die Ausführung vor UserInputChanged() - eine Race-Bedingung. Mein Code nicht verwendet SetTimeout nicht, aber ich bin mit dem träge UserInputChanged Validierungscode zu simulieren:
<!-- snip -->
<script>
var amount = null;
var currentControl = null;
function UserInputChanged(control) {
currentControl = control;
// use setTimeout to simulate slow validation code (production code does not use setTimeout)
setTimeout("ValidateAmount()", 100);
}
function SaveForm() {
// call web service to save value
document.getElementById("SavedAmount").innerHTML = amount;
}
function ValidateAmount() {
// various validationey functions here
amount = currentControl.value; // save value to collection
document.getElementById("Subtotal").innerHTML = amount; // update subtotals
}
</script>
<!-- snip -->
Amount: <input type="text" id="UserInputValue" onchange="UserInputChanged(this);" /> <br />
Subtotal: <span id="Subtotal"></span> <br />
<input type="button" onclick="SaveForm();" value="Save" /> <br /><br />
Saved amount: <span id="SavedAmount"></span>
<!-- snip -->
ich mir beschleunigen kann den Validierungscode nicht denken - es ist ziemlich leicht, aber es scheint, langsam Genug, dass der Code versucht, den Web-Service aufzurufen, bevor die Validierung abgeschlossen ist.
Auf meinem Computer ist ~ 95ms die magische Zahl zwischen, ob der Überprüfungscode ausgeführt wird, bevor der Sicherungscode beginnt. Je nach Computergeschwindigkeit des Benutzers kann dies höher oder niedriger sein.
Hat jemand irgendwelche Ideen, wie man mit dieser Bedingung umgeht? Ein Kollege schlug vor, einen Semaphor zu verwenden, während der Validierungscode läuft, und eine Speicherschleife im Speichercode, um zu warten, bis der Semaphor entsperrt wird - aber ich möchte vermeiden, irgendeine Art von Besetztschleife in meinem Code zu verwenden.
Genau das, was ich brauche. Vielen Dank! –