Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用setInterval()进行简单的连续轮询_Javascript_Ajax_Setinterval_Polling - Fatal编程技术网

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

Javascript 使用setInterval()进行简单的连续轮询,javascript,ajax,setinterval,polling,Javascript,Ajax,Setinterval,Polling,对于一个需要以设定的时间间隔刷新呈现给用户的部分数据的简单webapp,使用setInterval()从端点获取JSON而不是使用适当的轮询框架是否有任何缺点 在本例中,假设我每5秒刷新一次处理作业的状态。我的评论: 我会使用它,并且总是在收到之前的回复时调用它。通过这种方式,您可以避免可能出现的拥塞、函数堆叠或任何您想要调用的情况,以防请求/响应的时间超过您的时间间隔 比如说: function refresh() { // make Ajax call here, inside th

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

在本例中,假设我每5秒刷新一次处理作业的状态。

我的评论:

我会使用它,并且总是在收到之前的回复时调用它。通过这种方式,您可以避免可能出现的拥塞、函数堆叠或任何您想要调用的情况,以防请求/响应的时间超过您的时间间隔

比如说:

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

// initial call, or just call refresh directly
setTimeout(refresh, 5000);
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);

我知道这是一个老问题,但我被它绊倒了,在做事情的方式上,我认为我可能会改进它。您可能需要考虑类似于长轮询的解决方案。或者另一个解决方案是WebSocket(WebSocket的一个更好的实现,其主要目标是在所有浏览器上工作)

第一种解决方案基本上概括为发送一个AJAX请求并在发送另一个响应之前等待响应,然后在响应完成后,将下一个查询排队

同时,在后端,在状态改变之前,您不会返回响应。因此,在您的场景中,您将使用一个while循环,该循环将一直持续到状态更改,然后将更改后的状态返回到页面。我真的很喜欢这个解决方案。正如上面链接的答案所示,这就是facebook所做的(或者至少在过去已经做过)


io基本上是WebSocket的jQuery,因此无论用户在哪个浏览器中,都可以建立一个套接字连接,将数据推送到页面(根本不需要轮询)。这更接近黑莓的即时通知功能,如果你想使用即时通知,这是最好的解决方案。

你可以这样做:

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

// initial call, or just call refresh directly
setTimeout(refresh, 5000);
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);

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

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)
只需修改,是的,您可以通过调用
cancelCallback()

let cancelCallback=()=>{};
变量睡眠=(周期)=>{
返回新承诺((解决)=>{
取消回调=()=>{
日志(“取消…”);
//发送取消消息。。。
返回解析(“已取消”);
}
设置超时(()=>{
决议(“勾选”);
},期间)
})
}
var poll=(promiseFn,period,timeout)=>promiseFn()。然后(()=>{
让睡眠=异步(周期)=>{
让回应=等待睡眠(周期);
//如果你需要在睡眠结束后马上做点什么
log(“睡眠刚刚结束,做点什么…”);
回复;
}
//只需检查cancelCallback是否为空函数,
//如果是,请设置运行cancelCallback()的超时
if(cancelCallback.toString()==“()=>{}”){
log(“将timout设置为运行cancelCallback()”)
设置超时(()=>{
取消回调()
},超时);
}
睡眠(周期)。然后((响应)=>{
//检查睡眠是否已取消,如果未取消,则继续轮询
如果(响应!=“已取消”){
投票表决(承诺,期限);
}否则{
控制台日志(响应);
}
})
//做点什么。。。
log(“做点什么…”);
})
投票(()=>新承诺((解决)=>{
log('helloworld!');
resolve();//您需要解析才能跳转到。然后()
}), 3000, 10000);
//做点什么2。。。

log(“dosomething2….”)
我会使用
setTimeout
并总是在收到前一个响应时调用它。这样可以避免可能出现的拥塞、函数堆叠或任何你想称之为的情况。我就像@FelixKling所说的那样做到了,工作起来很有魅力。试试看!令人惊叹的!@FelixKling,你能不能把这个作为答案,我会接受的?这里有一个很好的分析,为什么避免
setInterval
是个好主意:我们应该使用
setTimeout(刷新,5000)两次?我的意思是在第一次调用之后,然后在被调用的函数中再次调用?@David,这是因为setTimeout不会在一个时间间隔内重复:它在第二个参数的时间量过期后(实际上是在函数被推到偶数队列之后,但我偏离了方向)触发传递到第一个参数的函数一次,您需要两个调用:第一个启动函数,第二个重复直到完成。为什么不在recursice rerfresh()中调用clearTimeout()?@danielgi:有什么意义?在调用刷新时,超时被称为“完成”。没有什么需要澄清的。虽然socket.io可能不错,但它不是WebSocket的解决方案,只是众多解决方案中的一个。所有这些(几乎)都以自己的方式好,你可以根据任务来考虑不同的框架。粗心,更新,以反映提到SOCKE.IGOODE的意图。作品例如,如果过了一段时间,我决定通过点击按钮来停止执行,我该怎么做呢?@Marcel,谢谢。简而言之,这是不可能的()。