轮询ajax功能超出了调用堆栈

时间:2016-04-25 23:08:15

标签: javascript jquery ajax polling

假设我有以下轮询功能:

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

所以我的函数以递归方式运行,但是我希望它的方式。我希望在我的递归调用start之前在控制台中打印控制台日志,但它没有。我已经确认我的后端端点正在运行并且正在返回json,所以我怀疑我的javascript代码中有一些我缺少的东西。有人有任何想法吗?

1 个答案:

答案 0 :(得分:1)

我不擅长js,但我遇到了setTimeout的问题。 根据{{​​3}}:

  

在3秒(3000毫秒)后显示警告框:

     

if (devices.Length > 1) { webCamTexture.Stop(); if (frontCamera == true) { webCamTexture.deviceName = devices[0].name; frontCamera = WebCamTexture.devices[0].isFrontFacing; } else { webCamTexture.deviceName = devices[1].name; frontCamera = WebCamTexture.devices[1].isFrontFacing; } webCamTexture.Play (); }

所以我认为你的代码在调用服务器之前等待了5个secondes,然后你每次时都会调用它,当你得到答案时立即

=>要解决您的问题,请将setTimeout 置于成功函数中。

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

顺便说一句,为了不重现那种问题,我也会按w3school的建议单独声明该功能。