2016-05-03 12 views
0

私はsetTimeoutの質問を一読しましたが、私が心に留めている質問には関係していません。私はsetInterval()を使用することができますが、私の好みのオプションではないことを知っています。setTimeoutで何か問題が発生しましたか?

理論的には1分以上ページをリフレッシュせずに複数のチェックを実行できるウェブアプリがあります。 私の関数がsetIntervalを使用して数百(またはそれ以上)時間を呼び出すと、私はうまくいかなくなるでしょうか?私は "スタックオーバーフロー"に達するでしょうか?

私がsetIntervalを使用すると、特に低速接続(2番目の接続が最初の接続が完了する前に発生)で2つの要求が同時に実行される可能性があります。リクエストが既にアクティブかどうかをテストするためのフラグを作成できますが、私は偽陽性を恐れています。

私の解決策は、関数をmy jquery ajaxコードを呼び出して実行し、次にajaxCompleteの一部としてsetIntervalを実行してX秒後に再度呼び出します。このメソッドはまた私が呼び出しの間の期間を変更することができますので、私のサーバーがビジー(遅い)の場合、1つの応答はajax呼び出しの間の時間を増やすフラグを設定できます。私の考えの

サンプルコード...

function ServiceOrderSync() 
{ 
    // 1. Sync stage changes from client with the server 
    // 2. Sync new orders from server to this client 
    $.ajax({ "data": dataurl, 
    "success": function(data) 
      { // process my data }, 
    "complete": function(data) 
      { 
       // Queue the next sync 
       setTimeout(ServiceOrderSync, 15000); 
      }); 

} 

答えて

2

コールが本当に再帰的ではありませんので、あなたは、スタックオーバーフローを取得することはありません(私は「疑似再帰」それを呼び出す)

JavaScriptはイベント駆動型の言語であり、setTimeoutと呼ぶと、イベントは保留中のイベントのリストに入れられ、コードの実行はあなたの所から続き、コールスタックは完全に解かれてから次のイベントがそのリストから引き出されます。

P.S.非同期コードを処理するためにjQueryを使用している場合は、Promisesを使用することを強くお勧めします。

+0

お返事ありがとうございます。私は約束を使用したことはありません - 私はそれらの参照を見てきましたが、彼らの経験はありません。私は学習と試しにはオープンしていますが、本番環境ではありません。 –

+0

私はhttps://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promiseを読んでいて、あなたの提案が良いものであり、私が必要とするものが快適であるように見えます。 –

+1

すべてのJS開発者はIMHOですが、jQueryの実装はES6(およびそれ以前のPromises/A)の仕様と全く同じではないことに注意してください。 – Alnitak

関連する問題