1

我有一个非常简短的问题。如果我使用 setInterval 方法调用一个 ajax 函数,比如每 3 秒检查一次收件箱中的消息会发生什么(或者如果我可以每 1 秒做一次就好了!)

好吧,这就是我使用的:

setInterval(function() {
chk_inbx (var1, var2);

}, 8000);

我现在每 8 秒调用一次这个函数。我看没问题。(或者我现在没有那么多用户)

但是如果我将它从 8000 更改为 3000 甚至 1000 会发生什么?

更新 我已经测试了轮询(LONG POLLING(在 php 中)在 5 次对数据库的请求后开始挂起

我想知道 setTimeout 和 setTimeout 与轮询有什么区别。我的理解是在 php 文件中他们放置了 sleep(); 函数并使用时间戳来确定数据是否旧。

但是我的,我使用 N nd Y 来确定是否读取了 msg。如果 N 则显示 rowCount。

那么有什么不同呢?谁能帮我 ?

4

2 回答 2

3

如果请求的完成时间比您的轮询时间长,则可能会导致问题。请求的持续时间将取决于您用户的网络速度和地理位置。浏览器会限制并发请求的数量,但它们会不断地对新请求进行排队,队列会增长到不合理的大小,可能会减慢甚至导致某些浏览器崩溃。

有更好的方法来实现你想做的事情。最常见的跨浏览器(websockets 也可以在现代浏览器中解决这个问题)方式是使用long polling

通过长轮询,您会在收到响应后立即发送请求,因此您始终在不断地进行轮询。Web 服务器处理进程空闲并重复检查新消息而不生成响应,直到超时(您可以选择 30 秒之类的时间)或有新数据通知浏览器。

于 2013-08-28T16:27:12.130 回答
3

您应该避免setInterval()以这种方式使用。

问题setInterval()在于它会每 3 秒(或其他任何时间)触发一次事件,即使前一个事件尚未完成。

如果您的响应时间比间隔时间慢,这可能会导致请求堆积如山,甚至可能无法按照请求的顺序响应。

您设置的间隔越小,这将变得越来越明显,但如果您的 JS 代码中有任何类型的阻塞事件,即使对于较大的间隔也可能是一个问题 - 一个alert()框将是典型的例子 - 因为你可以结束大量的间隔事件堆积起来等待警报被清除,然后立即全部触发。

更好的解决方案是使用自燃setTimeout()

这将用于setTimeout()启动事件序列,然后setTimeout()在其事件完成时在内部调用另一个相同的调用。这确保您永远不会像使用setInterval().

于 2013-08-28T16:30:55.527 回答