3

以前、次のjQuery Ajaxリクエストを使用して、サーバーから3秒ごとにAjaxポーリングを使用する質問について質問しました。

function getData() {
    $.ajax({
        url : 'http://example.com',
        type: 'GET',
        success : function(data) {
            // process data here
            setTimeout(getData, 3000);
        },
        dataType : 'json'
    });
}

これを行う別の方法は、setTimeoutを$ .ajax()ブロックの外に置くことのようです。

function getData() {
    setTimeout( function() {
    $.ajax({
        url : 'http://example.com',
        type: 'GET',
        success : function(data) {
            //process data here
        },
        dataType : 'json'
    }) }, 3000);
}

では、これら2つの方法に違いはありますか?3秒ごとにサーバーを継続的にポーリングするのと同じ効果がありますか?

また、成功コールバック関数内で、特定の条件が満たされた場合、たとえばdata.length> 1000の場合、この無限ポーリングを終了するにはどうすればよいですか。このループを終了して別の関数を呼び出しますか?私はこのようなことをする必要があります:

function getData() {
        var tID = setTimeout( function() {
        $.ajax({
            url : 'http://example.com',
            type: 'GET',
            success : function(data) {
                //process data here
                if(data.length > 1000) { 
                   funcOutside();
                   clearTimeout(tID);
                }
            },
            dataType : 'json'
        }) }, 3000);
    }
4

3 に答える 3

8

2番目のオプションは3秒ごとにポーリングしません。ポーリングは1回だけです。

条件付きでポーリングを続行または停止するには、最初のオプションのバリエーションを使用する必要がありsetTimeoutます。呼び出しの周囲に条件を追加します。

function getData() {
    $.ajax({
        url : 'http://example.com',
        type: 'GET',
        success : function(data) {
            // depending on the data, either call setTimeout or simply don't
            if( /* data says continue polling */) {
                setTimeout(getData, 3000);
            }
        },
        dataType : 'json'
    });
}
于 2013-01-31T22:04:47.663 に答える
3

では、これら2つの方法に違いはありますか?3秒ごとにサーバーを継続的にポーリングするのと同じ効果がありますか?

はい、重要な違いがあります!最初のバージョンは、応答が到着した後、関数の呼び出しをキューに入れます。したがって、呼び出しの間隔は(おおよそ)3000msに、要求/応答にかかった時間を加えたものになります。

2番目のバージョンは、3秒後にリクエストを行い、その後停止します。に変更setTimeoutするとsetInterval、3秒ごとに新しいリクエストが作成されますが、新しいリクエストが作成されたときに前のリクエストがすでに完了しているという保証はありません(1つのリクエストに約3000ミリ秒かかる場合)。したがって、最初のバージョンはおそらくあなたが探しているものです。

ループの終了について:はい、コードにあるような条件を追加するだけです。ただし、タイムアウトをクリアする代わりに、新しいタイムアウトを追加しないでください。

//process data here
if(data.length > 1000) { 
    funcOutside();
} else {
    setTimeout(getData, 3000);
}

getData最後の注意:技術的には、それ自体を呼び出していないため、再帰ではありませんが、常にsetTimeout呼び出すことからのコールバックgetDataです。

于 2013-01-31T22:05:42.560 に答える
0
(function loopsiloop(){
   setTimeout(function(){
   $.ajax({
       url: 'foo.htm',
       success: function( response ){
           // do something with the response

           loopsiloop(); // recurse
       },
       error: function(){
           // do some error handling.  you
           // should probably adjust the timeout
           // here.

           loopsiloop(); // recurse, if you'd like.
       }
   });
   }, 5000);
})();

これはあなたのために仕事をします。私はここで3つのことをしています:

  1. すぐに呼び出される関数loopsiloopを宣言します(最後のparensに注意してください)。
  2. 5秒後に起動するタイムアウトハンドラーを宣言します。
  3. タイムアウト内にサーバーをポーリングします。これは、成功/失敗のいずれかでloopsiloopを呼び出し、ポーリングを続行します。
于 2014-08-22T19:44:04.587 に答える