2016-04-25 12 views
0

を超えている:私はそれを起動するとポーリングAjaxの機能は、私は、次のポーリング機能を持っていると仮定し、コールスタックに

function pollingFunc(taskId){ 
    setTimeout(function() { 
    $.ajax({ 
     url: '/endpoint', 
     type: 'POST', 
     data: { 'celery_task_id': taskId }, 
     success: function(response){ 
     if(response.celery_ready) { 
      console.log('CELERY IS READY') 
     } else { 
      console.log('polling') 
      pollingFunc(response.task_id) 
     } 
     } 
    }) 
    }, 5000); 
} 

、成功コールバックが呼び出されることはありませんかそれはあるかもしれないが、私のconsole.logsは表示されません。代わりにしばらく後に私は得る

Uncaught RangeError: Maximum call stack size exceeded 

私の機能は再帰的に実行されているが、私はそれをしたいと思う方法で実行しています。再帰呼び出しの開始がコンソールに表示される前にコンソールログをリースしたいと思っていますが、そうではありません。バックエンドのエンドポイントが正常に動作していることを確認してjsonを返すので、JavaScriptコードに何か不足していると思われます。誰もが考えている?

+0

私はエラーハンドラと 'console.log'を追加します。あなたはネットワークのパネルであなたが200の応答を得ていることを確認しましたか? – winhowes

+0

これが役立つのかどうかは不明ですが、ここに記載されているconsole.logで問題が発生している可能性があります。http://stackoverflow.com/questions/8395718/javascript-funky-array-mishap – Blue

+0

ネストされた関数呼び出しの意味で、コードに再帰はありません。 'setTimeout'は非同期で、' $ .ajax'もそうです。 'pollingFunc'の実行には呼び出しスタックの別の' pollingFunc'がありません。何か他のことが起こっている、あなたの質問に表示されていません。 – Igor

答えて

1

私はjsが良くありませんが、setTimeoutに問題がありました。 w3schoolによると :

3秒(3000ミリ秒)後に表示警告ボックスを:

setTimeout(function(){ alert("Hello"); }, 3000);

だから私はあなたのコードは、サーバーを呼び出す前に5 secondesを待って、その後だと思います答えが得られたら、とすぐにと呼びます。

=>問題を解決するには、成功関数にのsetTimeoutを入れてください。ところで

function pollingFunc(taskId){ 
    $.ajax({ 
     url: '/endpoint', 
     type: 'POST', 
     data: { 'celery_task_id': taskId }, 
     success: function(response){ 
     if(response.celery_ready) { 
      console.log('CELERY IS READY') 
     } else { 
      console.log('polling') 
      setTimeout(function() { 
      pollingFunc(response.task_id); 
      }, 5000); 
     } 
     }); 
    } 

、問題のようなものを再現しないようにJQuery documentationの助言として、私はまた、個別にその関数を宣言します。

+0

ええ私はケーキを持っていて、成功コールバックの外で定義された再利用可能なポーリング機能を使用して食べて、再利用できるようにしたかったのです。これを行う方法がないことが判明した場合、私は先に進んでこの答えを受け入れます。 – theamateurdataanalyst

+0

あなたのコードをまだ再利用可能な関数にして、私の答えを編集しました。 – vtellier

+1

「毎回それを呼び出してすぐに」 - すぐに何を呼びますか?彼は 'pollingFunc'を呼び出し、別の' setTimeout'を待ち行列に入れて終了します。 – Igor

関連する問題