我编写了一个轮询脚本来接收新创建的数据记录。我想每隔一秒钟执行一次调用。
我尝试运行asynchronously,轮询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) {
[...]
});
}
UPDATE:我同时使用普通浏览器和私有浏览器(firefox)窗口测试轮询,以尝试该功能。我刚刚注意到,只有当两个窗口同时运行轮询时,问题才会发生。
也许是火狐的窃听器..。
发布于 2015-08-14 14:59:29
OP希望以不干扰主线程(即后台线程)的方式运行Polling
。唯一能做到这一点的方法是使用WebWorker,他特别不想使用它。
有关一堆有趣的阅读,请参阅关于W3的事件循环文档,但基本上浏览器中发生的一切都是单线程的。所有的javascript都将发生在主线程上(除了web工作人员)。setTimeout
和setInterval
所做的只是对一个回调进行队列,该回调将在~x秒后在主线程中运行。
很抱歉,除了网络工作者,没有别的办法了。
发布于 2015-08-14 14:38:18
您可以使用这样的长轮询模式:
(function Polling() {
setTimeout(function() {
$.ajax({ url: "server", success: function(response) {
//your try/catch here
}, dataType: "json", complete: Polling });
}, 5000);
})();
因此,投票将尝试在重新启动之前完成,即使服务器作业很长.
https://stackoverflow.com/questions/32012279
复制相似问题