使用setInterval()进行简单的连续轮询

Sol*_*oub 34 javascript ajax polling setinterval

对于需要刷新以设置间隔呈现给用户的部分数据的简单webapp,使用setInterval()从端点获取JSON而不是使用适当的轮询框架是否有任何缺点?

为了举例,我想说我每5秒刷新一次处理作业的状态.

Fel*_*ing 54

从我的评论:

我会使用setTimeout [docs]并在收到上一个回复时总是调用它.这样,您可以避免可能的拥塞或功能堆叠或任何您想要调用它的情况,以防请求/响应时间超过您的间隔.

所以像这样:

function refresh() {
    // make Ajax call here, inside the callback call:
    setTimeout(refresh, 5000);
    // ...
}

// initial call, or just call refresh directly
setTimeout(refresh, 5000);
Run Code Online (Sandbox Code Playgroud)

  • 这里有一个很好的分析,为什么避免`setInterval`是一个好主意:http://weblogs.asp.net/bleroy/archive/2009/05/14/setinterval-is-moderately-evil.aspx (3认同)
  • 这里是否会发生更多的堆栈分配,因为它是另一个轮询中另一个轮询中的轮询,太多的递归函数? (2认同)

bsc*_*ter 12

可以使用Promises在最近的浏览器中实现简单的非阻塞轮询功能:

var sleep = time => new Promise(resolve => setTimeout(resolve, time))
var poll = (promiseFn, time) => promiseFn().then(
             sleep(time).then(() => poll(promiseFn, time)))

// Greet the World every second
poll(() => new Promise(() => console.log('Hello World!')), 1000)
Run Code Online (Sandbox Code Playgroud)

  • 好的。作品。例如,如果一段时间后我决定通过单击按钮停止执行,我该怎么做? (2认同)

Sce*_*cen 6

你可以这样做:

var i = 0, loop_length = 50, loop_speed = 100;

function loop(){
    i+= 1; 
    /* Here is your code. Balabala...*/
    if (i===loop_length) clearInterval(handler);
}

var handler = setInterval(loop, loop_speed);
Run Code Online (Sandbox Code Playgroud)