Вот сценарий:Как избежать яваскрипта состояние гонки
Мои пользователи представлены сетки, в основном, урезанная версия таблицы. В каждой строке сетки есть текстовые поля. Когда они меняют значение в текстовом поле, я выполняю проверку на их входе, обновляя коллекцию, управляющую сеткой, и перерисовывая промежуточные итоги на странице. Все это обрабатывается событием OnChange для каждого текстового поля.
Когда они нажимают кнопку «Сохранить», я использую событие OnClick для кнопки, чтобы выполнить окончательную проверку количества, а затем отправить весь свой вклад в веб-службу, сохранив ее.
По крайней мере, это то, что происходит, если они вставляют форму в кнопку «Отправить».
Проблема заключается в том, что если они вводят значение, то сразу нажмите кнопку сохранения, SaveForm() начнет выполнение до того, как UserInputChanged() завершает условие гонки. Мой код не использует SetTimeout, но я использую его для имитации вялого UserInputChanged проверочного кода:
<!-- 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 -->
Я не думаю, что я могу ускорить проверочный код - это довольно легкие, но, по-видимому, медленно достаточно, чтобы код пытался вызвать веб-службу до завершения проверки.
На моей машине ~ 95 мс - это магическое число между тем, выполняется ли код проверки до начала кода сохранения. Это может быть выше или ниже в зависимости от скорости компьютера пользователя.
Есть ли у кого-нибудь идеи, как справиться с этим состоянием? Сотрудник предложил использовать семафор при запуске кода проверки и цикл занятости в коде сохранения, чтобы дождаться разблокировки семафора, но я бы хотел избежать использования какого-либо цикла занятости в моем коде.
Точно, что мне нужно. Благодаря! – 2008-12-03 18:13:48