【发布时间】:2015-08-14 14:18:41
【问题描述】:
我编写了一个轮询脚本来接收新创建的数据记录。我想每隔N 秒执行一次调用。
我尝试setTimeout() 和setInterval() 运行轮询异步,但是在执行Polling() 函数时都冻结了浏览器,这对我来说真的很奇怪。
我在页面加载时调用StarPolling() 函数。 APICall() 函数是 jQuery $.POST 函数,它在任何其他情况下都运行良好 - 并且是异步的。
这是我与setTimeout()一起使用的代码
var pollinginterval = 5000;
function StartPolling()
{
setTimeout(Polling, pollinginterval);
}
function Polling()
{
[... some code ...]
var api_call = 'API_URL';
var api_call_parameters = {
[...]
};
APICall(api_call, api_call_parameters, function(json_response)
{
/* this is the callback belongs to the $.POST request */
[... some code ...]
setTimeout(Polling, pollinginterval);
});
}
我尝试使用setInterval() 的版本非常相似,除了递归调用。
我不能为此使用 Workers 或 HTML5 套接字,因为必须支持跨浏览器。
有没有办法以真正的异步方式运行轮询,或者在不冻结浏览器的情况下通过 JavaScript 使用 新的“线程”?
更新:
这就是APICall() 的运作方式:
function APICall(call, parameters, success_callback)
{
$.post(apibase + "" + call,parameters)
.done(function(response){
try
{
var json_response = $.parseJSON(response);
}
catch(error)
{
[...]
}
if(json_response.header.status == "OK")
{
success_callback(json_response);
}
else if(json_response.header.status == "error")
{
[...]
}
})
.fail(function(error) {
[...]
});
}
更新:我正在同时使用普通和私人浏览器 (firefox) 窗口测试轮询以尝试该功能。我刚刚注意到,只有当两个窗口同时运行轮询时才会出现问题。
可能是firefox的bug……
【问题讨论】:
-
APICall到底是做什么的?这就是问题所在。是在做同步AJAX吗? -
您是否对您的应用程序进行了概要分析?
-
如果我是你;首先我要做的是删除 APICall 方法中的 ajax 调用,然后放一个 console.log 看看浏览器是否仍然挂起重复的间隔调用.....
-
在调用 APIcall() 之前可能是 [ ... some code ...] 部分中的内容
-
我在您的代码中没有看到任何会冻结浏览器的内容。
标签: javascript jquery ajax asynchronous polling