Как избежать расы в javascript

Уловно названный urlencode () и urldecode () .

Однако вам не нужно использовать urldecode() для переменных которые появляются в $_POST и $_GET.

22
задан Esteban Küber 19 October 2009 в 02:11
поделиться

6 ответов

Используйте семафор (давайте назовем его StillNeedsValidating). если функция SaveForm видит, что семафор StillNeedsValidating произошел, имейте его, активируют второй собственный семафор (который я назову FormNeedsSaving здесь), и возврат. Когда проверка функционирует концы, если семафор FormNeedsSaving произошел, это вызывает функцию SaveForm самостоятельно.

В jankcode;

function UserInputChanged(control) {
    StillNeedsValidating = true;
    // do validation
    StillNeedsValidating = false;
    if (FormNeedsSaving) saveForm(); 
}

function SaveForm() {
    if (StillNeedsValidating) { FormNeedsSaving=true; return; }
    // call web service to save value
    FormNeedsSaving = false;
}
23
ответ дан zaratustra 19 October 2009 в 02:11
поделиться

Я думаю, что тайм-аут вызывает Вашу проблему..., если это будет простым кодом (никакие асинхронные вызовы Ajax, тайм-ауты и т.д.) тогда, я не думаю, что SaveForm будет выполняться, прежде чем UserInputChanged завершается.

4
ответ дан Greg 19 October 2009 в 02:11
поделиться

Отключите кнопку сохранения во время проверки. Установите его на отключенный как первая вещь, которую проверка делает и повторно включает его, поскольку это заканчивается.

, например,

function UserInputChanged(control) {
    // --> disable button here --< 
    currentControl = control;
    // use setTimeout to simulate slow validation code (production code does not use setTimeout)
    setTimeout("ValidateAmount()", 100); 
}

и

function ValidateAmount() {
    // various validationey functions here
    amount = currentControl.value; // save value to collection
    document.getElementById("Subtotal").innerHTML = amount; // update subtotals
    // --> enable button here if validation passes --<
}

необходимо будет корректироваться, когда Вы удаляете setTimeout и делаете проверку одной функцией, но если у Ваших пользователей нет сверхчеловеческих отражений, необходимо быть хорошими для движения.

9
ответ дан Andrew Rollings 19 October 2009 в 02:11
поделиться

У Вас нет состояния состязания, условий состязания не может произойти в JavaScript, так как JavaScript является единственным, распараллелил, таким образом, 2 потока не могут вмешиваться друг в друга.

примером, который Вы даете, не является очень хороший пример. Вызов метода setTimeout поместит вызванную функцию в очередь в механизме JavaScript и выполнит его позже. В той точке при нажатии на кнопку сохранения не будет вызвана функция setTimeout, пока сохранение полностью не закончено.

то, Что, вероятно, происходит в Вашем JavaScript, - то, что onClick событие называет механизм JavaScript, прежде чем onChange событие назовут.

Как подсказка, имейте в виду, что JavaScript является единственным, распараллелил, если Вы не используете отладчик JavaScript (поджигатель, Microsoft screipt отладчик). Те программы прерывают поток и приостанавливают его. От той точки на других потоках (или через события, вызовы метода setTimeout или через обработчики XMLHttp) может тогда работать, заставляя это казаться, что JavaScript может выполнить несколько потоков одновременно.

-1
ответ дан 19 October 2009 в 02:11
поделиться

Вы могли настроить повторяющуюся функцию, которая контролирует состояние всей сетки и генерирует событие, которое указывает, допустима ли вся сетка или нет.

Ваш 'утверждают, что форма' кнопка тогда включила бы или отключила бы себя на основе того состояния.

, О, я вижу подобный ответ теперь - который работает также, конечно.

0
ответ дан neonski 19 October 2009 в 02:11
поделиться

Семафор или взаимное исключение являются, вероятно, лучшим способом пойти, но вместо занятого цикла, просто использовать setTimeout() для моделирования сна потока. Как это:

busy = false;

function UserInputChanged(control) {
    busy = true;
    currentControl = control;
    // use setTimeout to simulate slow validation code (production code does not use setTimeout)
    setTimeout("ValidateAmount()", 100); 
}

function SaveForm() {
    if(busy) 
    {
       setTimeout("SaveForm()", 10);
       return;
    }

    // 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
    busy = false;
}
3
ответ дан AllInOne 19 October 2009 в 02:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: