私のユーザーには、基本的にはスプレッドシートの簡素化されたバージョンが表示されます。グリッドの各行にテキスト ボックスがあります。テキスト ボックスの値を変更すると、入力の検証を実行し、グリッドを駆動するコレクションを更新し、ページの小計を再描画します。これはすべてOnChange
、各テキストボックスのイベントによって処理されます。
ユーザーがボタンをクリックするとSave、ボタンのOnClick
イベントを使用して金額の最終的な検証を行い、入力内容全体を Web サービスに送信して保存します。
少なくとも、フォームをタブでSubmitボタンに移動すると、それが起こります。
問題は、値を入力してすぐに保存ボタンをクリックすると、完了SaveForm()
する前に実行が開始UserInputChanged()
され、競合状態になることです。私のコードでは を使用していませんが、遅い検証コードsetTimeout
をシミュレートするために使用しています。UserInputChanged
<script>
var amount = null;
var currentControl = null;
function UserInputChanged(control) {
currentControl = control;
// use setTimeout to simulate slow validation code
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;
}
</script>
Amount: <input type="text" onchange="UserInputChanged(this)">
Subtotal: <span id="Subtotal"></span>
<button onclick="SaveForm()">Save</button>
Saved amount: <span id="SavedAmount"></span>
検証コードを高速化できるとは思いません。かなり軽量ですが、検証が完了する前にコードが Web サービスを呼び出そうとするほど遅いようです。
私のマシンでは、コードの保存が始まる前に検証コードが実行されるかどうかの間のマジック ナンバーは ~95ms です。これは、ユーザーのコンピューターの速度に応じて、より高くなったり低くなったりする場合があります。
この状態を処理する方法を知っている人はいますか? 同僚は、検証コードの実行中にセマフォを使用し、保存コードでビジー ループを使用してセマフォのロックが解除されるまで待機することを提案しましたが、コードでビジー ループを使用することは避けたいと思います。