2016-04-25 70 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

相關問題