Die Vermeidung einer javascript-race-Bedingung

Hier ist das Szenario:

Meine Benutzer präsentiert ein raster, im Grunde eine abgespeckte version einer Tabellenkalkulation. Dort sind Textfelder, die in jeder Zeile im raster. Wenn Sie ändern einen Wert in eine textbox, ich bin Validierung durchführen, die auf Ihrer Eingabe, Aktualisierung der Sammlung, die ' s fahren mit dem Gitter, zieht die Zwischensummen auf der Seite. Dies alles erfolgt durch das OnChange-Ereignis für jedes Textfeld.

Wenn Sie klicken Sie auf die Schaltfläche "Speichern", ich bin mit der Schaltfläche OnClick-Ereignis um einige abschließende Validierung auf die Beträge, und senden Sie dann Ihre gesamte Eingabe zu einem web-service zu speichern.

Zumindest ist das, was passiert, wenn Sie die tab durch das Formular auf den Submit-button.

Das problem ist, wenn Sie einen Wert eingeben, dann klicken Sie sofort auf die Schaltfläche speichern, SaveForm() beginnt mit der Ausführung vor UserInputChanged() beendet -- eine race-Bedingung. Mein code nicht verwenden, setTimeout, aber ich versuche zu simulieren, die träge UserInputChanged Validierung code:

 <!-- 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 glaube nicht, ich kann Geschwindigkeit bis die Validierung der code-es ist ziemlich leicht, aber offenbar langsam genug, dass code versucht, um den Webdienst aufzurufen, bevor die Validierung abgeschlossen ist.

Auf meinem Rechner, ~95ms ist die Magische Zahl unterscheiden, ob der Validierungs-code wird ausgeführt, bevor das speichern-code beginnt. Dieser kann höher oder niedriger je nach Rechner-Geschwindigkeit.

Hat jemand irgendwelche Ideen, wie man diesem Zustand? Ein Mitarbeiter hat vorgeschlagen, eine semaphore, während der Validierungs-code ausgeführt wird und eine busy-loop in den save-code zu warten, bis die semaphore entriegelt-aber ich möchte vermeiden, mit jeder Art von busy-Schleife in meinem code.

InformationsquelleAutor der Frage Jeremy Frey | 2008-12-03

Schreibe einen Kommentar