javascript にいくつか問題があります。これはいくつかの問題を引き起こします。DevExpress MVC GridView、ASP.Net MVC 3、および javascript を使用しています。
これは私の問題です:
たとえば、顧客を含むグリッドビューがあります。顧客を選択して、javascript によって生成されたテーブルに表示するようにして、それらすべての更新を取得しないようにします。その後、他の情報を追加して、別のテーブルに再度保存できるようにしますが、それはそれほど重要ではありません。
選択した顧客から表の行を生成する前に、いくつかの計算を実行します。もう 1 つの問題は、devexpress グリッドビューには、約 100 ミリ秒待機する代わりに、各選択変更を呼び出すイベントがあるため、ユーザーはメソッドを 3/4 回トリガーせずにすばやく複数選択できることです。
配列を介して自分のテーブルを追跡しています。また、DevExpress の GridView には、適切な情報を提供できる独自のイベントが含まれているため、心配する必要はありません。したがって、メソッド receiveSelectionFields(Values){ //do something } を取得しました。ここで、選択ごとにグリッドビューからその情報を受け取ります。次に、配列をチェックして、選択範囲が追加または削除されたかどうか、およびどれを確認します。次に、addtablerow(customer) または removetablerow(customer) を呼び出します。これにより、顧客がテーブルから削除され、次にアレイから削除されます。
その間にいくつかの重い計算を行うため、計算が完了するまでに最大 60 ミリ秒の遅延があります (私のコンピューターでは)。したがって、ユーザーが 60 ミリ秒で 2 つの選択を行った場合。私の配列は間違った値を持ち (顧客を追加/削除する最初の呼び出しによって変更されません)、私の JavaScript はエラーを引き起こします (テーブルの行が削除されないなど)。自分の配列の長さと受信した配列の長さをチェックして、何かが追加または削除されたかどうかを確認します。
それで、私は何を試しましたか?私の方法を再帰的な方法にし、問題が発生したときに60ミリ秒待ってから方法をやり直します。しかし、これは正しく機能していません。
グローバル変数 busy を追加してみました。これは、メソッドがまだビジーである場合に当てはまります。そして、それが終わるとfalse。しかし、それを行うとブラウザが終了します。これはコードでした:
while (true) {
setTimeout(function () {
if (busy === false) {
break;
}
}, 50);
}
しかし、それが無限にループしているように感じました。
これらはすべて回避策であり、これを解決する良い方法があるはずです。何かご意見は?
要するに、機能を同期してオフにする方法が必要です。それらが非同期と呼ばれていても。私の配列が台無しにならないように、ユーザーによって。
私の問題が存在する理由の答えを見つけました:javascriptは同期であるため。言語 (1 スレッド)。関数は適切なタイミングでトリガーされているはずです。問題は、MVC 拡張機能の DevExpress Gridview からのコールバックです。サーバーへのコールバックが行われ、サーバーは選択されたフィールド値で約 150 ミリ秒で応答します。devexpress 関数を 2 回すばやくトリガーすると、エラーが発生します。2 番目のトリガーには、最初のトリガーよりも FASTER を返すウィンドウがあります。これは、何かが追加または削除されたかどうかを確認するため、テーブルのコーディングが台無しになることを意味します。したがって、最初のトリガー(2番目のトリガーの後に返される)と私のテーブルが更新されたとき。最後に選択する前のテーブルが表示されます。したがって、1行が欠落しているか、本来あるべき行よりも1行多くなっています。
そのため、すべてのイベントを取得する関数を作成し、各注文の後に最大 200 ミリ秒の順序で配置する必要がありました。コールバックが取得するのに十分な時間を確保するため。もちろん、これはまだ信頼できるものではありませんが、これに関する要件を変更するだけだと思います。