假设我有以下轮询功能:
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代码中有一些我缺少的东西。有人有任何想法吗?
答案 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的建议单独声明该功能。