Ajax.PeriodicalUpdater

new Ajax.PeriodicalUpdater(container, url[, options])

周期性地执行一个 AJAX 请求并根据返回的响应文本更新指定容器的内容。它提供了一种“退化(decay)”机制 —— 当相邻两次请求的响应内容无变化时,会自动增加后续请求的时间间隔。

该对象解决了常见的要求进行周期性更新的需求,常被用于各种需要“轮询”机制的场合 (例如在线聊天室或在线邮件客户端)。

基本的思路是按照指定的时间间隔定时运行一个指定的 Ajax.Update,如果 decay 选项(请看下面)被激活,则监视响应的内容,并根据其是否变更来调整请求的时间间隔。

附加选项

Ajax.PeriodicalUpdater 支持所有的公用选项及回调,同时也支持 Ajax.Updater 引入的选项。另外,它还提供了两个新的选项用于处理起始的时间间隔和请求频率的减小比率。

选项默认值描述
frequency 2 注意:这不是一个频率(如 0.5Hz),而是一个时间段(如:多少秒)。别杀我,这不是我弄的。在实际应用中,2 秒是 Ajax 请求的最小时间间隔,你不应该将它设为更小的值(否则如果请求的处理和返回花费的时间稍长,你将不得不面对多个并行的请求)。 但是理论上可以提供小于 1 的时间间隔,如 0.75 秒。
decay 1 当响应内容无变化时,控制请求时间间隔的增长比率。它被用来和当前的时间间隔(初始值是 frequency 参数)相乘。每次请求返回的内容无变化时,当前的时间间隔就乘以 decay。因此,默认值意味着时间间隔不会发生变化, 而值大于 1 时间间隔会增加,值小于 1 是很危险的:如果在较长的时间内响应的内容都无变化,请求的时间间隔会越来越短, 直到你的浏览器无法承受而崩溃。注意:一旦响应内容发生变化,当前的时间间隔会被重置为初始值(frequency 的值)。

为更好的理解 decay,下面列出了一个样例及该样例运行时发生的请求调用序列的一小部分:

new Ajax.PeriodicalUpdater('items', '/items', { method: 'get', frequency: 3, decay: 2 }); 
调用顺序 调用时间 调用前 Decay 值 响应变化 调用后 Decay 值 下一时间间隔 注释
100:002n/a13 第一次调用,没有之前的响应可供比较,因此认为响应是变化的。
200:031yes13 响应再次改变:我们将 decay“重设”为 1,事实上在前面 decay 就已经为 1 了。
300:061no26 响应无变化,decay 参数值变成其与 decay 选项因子的乘积:我们需要等待再长的时间
400:122no412 仍然无变化,再次加倍
500:244no824 继续,没完没了了!
600:488yes13 终于结束了!重设 decay 为 1,因此又可以使用初始的时间间隔了。

禁用和重新启用 PeriodicalUpdater

PeriodicalUpdater 运行期间,如果你想中止请求,只需简单的调用它的 stop 方法。 要再次启用它,调用它的 start 方法。两者都不需要参数。

切记!这不是一种特例!

不论它们的名称有多么类似,Ajax.PeriodicalUpdater 都不是 Ajax.Updater 的一种特例。所以不要指望能够使用 Ajax.Request 提供的常规方法以及 Ajax.Updater 所继承的方法(译注:Ajax.Updater 继承了 Ajax.Request),例如 evalJSONgetHeader。另外,onComplete 回调也被劫持以用于更新管理,因此,如果你希望在每次请求成功后获得通知,请使用 onSuccess(注意:它将在更新被执行前调用)。