3

私は現在、一連のajaxリクエスト(40-50)を実行し、それらすべてを再度実行する次のコードを取得しています。(したがって、本質的に永遠にそれらを行います)

コード:

 $(document).ready(function () {
        window.setInterval(function () {
            $('div.env').each(function (index, item) {
                var vm = $(item).text();                    
                var env = "http://localhost:56656/HTML" + vm + ".htm";
                $.ajax(env, {
                    async: false,
                    URL: env,
                    type: "GET",
                    dataType: "html",
                    success: function (data) {
                        //alert("Colouring");
                        var style = $(data).filter('div').attr('style');
                        var styleObj = {};
                        $.each(style.split(';'), function () {
                            var rule = this.split(':');
                            styleObj[$.trim(rule[0])] = $.trim(rule[1]);
                        });

                        $(item).css('background', styleObj.background);

                    },
                    error: function () {

                        $(item).css('background', '#f00');
                    }
                });

            });

        }, 10000);
    });

ご覧のとおり、私は現在、IEで特に低速で実行され、Chromeでは低速で実行されるタイムアウトを使用しています。遅いと言うときは、すべてのajaxリクエストが完了し、画面が更新で更新されることを意味します。これは常にIEに当てはまり、場合によってはChromeにも当てはまります。理想的には、ajaxにリクエストを実行させ、更新してから次のajaxリクエストを実行してもらいたいと思います。

AJAXリクエストを継続的に行うためのより良い方法はありますか?

よろしくお願いします、ジェームス

4

4 に答える 4

2

Caolan の非同期ライブラリを使用することもできます。コードは次のようになります(async.jsもちろん含めた後):

$(document).ready(function () {
    function call() {
        var calls = [];
        $('div.env').each(function (index, item) {
            calls.push(function(callback) {
                $.ajax({
                    // DO NOT USE async: false!!!!
                    // some ajax settings
                    complete : function() {
                        callback();
                    }
                });
            });
        });
        async.parallel(calls, function() {
            /* This will fire when every call finishes.
               You may want to add timeout here, or else
               you will end up flooded with requests. */
            call();
        });
    };
});

必要に応じて調整する必要があります(asyncエラーも処理できます。ドキュメントを読んでください)。次々と発射してほしいとおっしゃっていたので、async.series代わりに を使ってasync.parallelください。

ところで、このコード:

$.ajax({
    async: false

悪の権化!!!他のすべてのスクリプト、さらにはブラウザ全体をブロック!!! それがおそらく「ゆっくり点滅する」問題の理由です。

于 2012-07-10T14:20:34.007 に答える
0

あなたのケースでそれが可能かどうかはわかりませんが、SignalRやNode.Js +Socket.IOのようなWebSocket/ロングポーリングソリューションは、通常、継続的なポーリングよりもうまく機能します。

于 2012-07-10T14:31:41.087 に答える
0

これは、他の何よりもアーキテクチャの問題だと思います。

構造を再構築して配列をサーバーに送信し、応答を 1 つの html ページまたはjson オブジェクトに結合して送信することをお勧めします。

この理由は明らかに引用です。あなたが何をしても、40-50 の同時 ajax リクエスト リクエストは最も決定的に常に遅くなります。複雑なため IE にはありません)、40 リクエストは少なくとも 400 ミリ秒の排他的時間を意味し、クライアントのパフォーマンスの問題につながります。あなたの場合、

async: false

その排他時間にリクエスト時間を追加することもできるため、リクエストが 10 ミリ秒で終了する場合 (ほとんどありません)、さらに 400 ミリ秒のクライアント排他時間を使用します。

したがって、クライアント側で解決策を探すことは、ここでは実際にはオプションではありません。

于 2012-07-10T14:56:51.653 に答える
0

setTimeout()代わりに使用setInterval()して、次のことを行う必要があります。

  • リクエストが失敗した場合は、好きなことをしてください:)
  • リクエストが成功した場合は、setTimeout()
于 2012-07-10T14:38:42.647 に答える