2016-11-04 14 views
0

単純なJQuery AJAXポーリングを作成しようとしています。 Webサーバーが遅い場合(特定の状況で非常に頻繁に...)、要求がブラウザーで「バックアップ」されないようにしたいです。ここでJquery AJAXタイムアウトが期待通りに機能しない

は私のコードです:

(function poll() { 
    $.ajax({ 
     url: CONFIG.apiBase, 
     type: 'GET', 
     data: { name: DESTINATIONS }, 
     traditional: true, 
     success: updateDisplay, 
     error: getError, 
     complete: setTimeout(poll, 2000), 
     timeout: 10000, 
    }); 
})(); 

私は、これは動作するはずだと思うの方法は、要求が成功した場合、それはupdateDisplayを行い、その後、別のポーリング要求を開始する前に2秒を待つということです。

しかし、私のサーバーが超低速で10秒以内に応答できない場合は、getErrorが呼び出され、要求が取り消され、最後に2秒間待機してから再びポーリングを試みます。

しかし、実際にはどのようなが起こることは、サーバが遅いされている場合、要求はバックアップさせ、ブラウザは一貫してポーリングし、サーバごとに2秒ということです:

enter image description here

私は基本的にどのように誤解アムtimeoutは動作するはずですか?

+2

問題は 'setTimeout(poll、2000)'の行です.2秒ごとに関数を再帰的に呼び出すのが問題です。 –

+1

あなたは即座に 'setTimeout(poll、2000)、'を呼び出して、関数クロージャでラップしようとしています。 'function(){setTimeout(poll、2000); } ' – Keith

+0

setTimeout id参照をメソッドに設定しています... – epascarello

答えて

1

問題はsetTimeout(poll, 2000)行です。現時点では、前のリクエストが完了するのを待たずに、poll()が2秒ごとに機能しています。

(function poll() { 
    $.ajax({ 
     url: CONFIG.apiBase, 
     type: 'GET', 
     data: { name: DESTINATIONS }, 
     traditional: true, 
     success: updateDisplay, 
     error: getError, 
     complete: function() { 
      setTimeout(poll, 2000) 
     }, 
     timeout: 10000, 
    }); 
})(); 
+0

完璧な、それは働いた。だから、おそらく私はJavascriptに関する何かを誤解しています。 'completeTime:'の直後に 'setTimeout'()を置くと、' poll() 'を呼び出すときに' setTimeout() 'が呼び出されますか? –

+1

はい、そうですが、それは 'setTimeout()'に排他的ではありません。あなたのコードは即座に 'setTimeout()'関数を実行し、その応答値を 'complete'プロパティに設定していました。関数の参照を返すと(上記のコードのように)、関数内のロジックは必要になるまで実行されません。 'success'プロパティと' error'プロパティと同様に、それぞれ 'updateDisplay()'と 'getError()'の参照を提供しています。これを 'success:updateDisplay()'に変更した場合、すぐに関数が実行され、プロパティの値に対する応答が設定されます。 –

+0

ありがとう、それは完璧な意味合いがあり、あなたがそれを説明したので今明らかです。 –

関連する問題