0

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 ミリ秒の順序で配置する必要がありました。コールバックが取得するのに十分な時間を確保するため。もちろん、これはまだ信頼できるものではありませんが、これに関する要件を変更するだけだと思います。

4

1 に答える 1

1

あなたの while ループ条件は true であるため、ループは無限に続きます。次のことを試してみてください。

var int = setInterval(function () {
    if(busy === false) {
        clearInterval(int);
    }
}, 50);

setTimeout を何度もループする代わりに、これを試してください。私が推測しなければならなかった場合、ブレークは if ステートメントを中断していますが、while ループではなく、ブラウザが無限ループに陥っています。上記のコードでは、コードを実行する間隔を設定できます。この例では、コードは 50 ミリ秒ごとに実行されます。if ステートメント内の条件が true になると、setInterval がクリアされ、ブラウザは通常の機能を実行し続けます。

お役に立てれば。

于 2012-10-04T13:50:53.810 に答える