首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步JavaScript轮询使用setTimeout或setInterval冻结浏览器

异步JavaScript轮询使用setTimeout或setInterval冻结浏览器
EN

Stack Overflow用户
提问于 2015-08-14 14:18:41
回答 2查看 1.2K关注 0票数 1

我编写了一个轮询脚本来接收新创建的数据记录。我想每隔一秒钟执行一次调用。

我尝试运行asynchronously,轮询setTimeout()setInterval(),但是在执行Polling()函数时都冻结了浏览器,这对我来说真的很奇怪。

加载页面时,我调用StarPolling()函数。APICall()函数是一个jQuery $.POST函数,它在任何其他情况下都能很好地工作--而且是异步的。

这是我在setTimeout()中使用的代码

代码语言:javascript
运行
复制
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()的操作方式:

代码语言:javascript
运行
复制
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)窗口测试轮询,以尝试该功能。我刚刚注意到,只有当两个窗口同时运行轮询时,问题才会发生。

也许是火狐的窃听器..。

EN

回答 2

Stack Overflow用户

发布于 2015-08-14 14:59:29

OP希望以不干扰主线程(即后台线程)的方式运行Polling。唯一能做到这一点的方法是使用WebWorker,他特别不想使用它。

有关一堆有趣的阅读,请参阅关于W3的事件循环文档,但基本上浏览器中发生的一切都是单线程的。所有的javascript都将发生在主线程上(除了web工作人员)。setTimeoutsetInterval所做的只是对一个回调进行队列,该回调将在~x秒后在主线程中运行。

很抱歉,除了网络工作者,没有别的办法了。

票数 0
EN

Stack Overflow用户

发布于 2015-08-14 14:38:18

您可以使用这样的长轮询模式:

代码语言:javascript
运行
复制
(function Polling() {
    setTimeout(function() {
        $.ajax({ url: "server", success: function(response) {
            //your try/catch here
        }, dataType: "json", complete: Polling });
    }, 5000);
})();

因此,投票将尝试在重新启动之前完成,即使服务器作业很长.

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32012279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档