jQuery IIFE,按需插话

jQuery IIFE, interject on demand?

本文关键字:IIFE jQuery      更新时间:2023-09-26

我有一个IIFE,它在加载时自发一次,每30秒递归调用一次,以获取系统可能已经写出的任何警报。

这工作正常。

(function GetAlerts() {
   setTimeout(function() {
     $.ajax({ url: "?DO=getalertcount", success: function(data) {
        //do DOM stuff with data            
    }, complete: GetAlerts });
  }, 30000);
})();

我会做一些事情,例如停止写入警报队列的小部件。 因此,这应该立即触发警报显示,而不是等待长达 30 秒才能触发。 (由于服务器限制,套接字和长轮询不是一个选项(

因此,我想以某种方式从操作处理程序按需调用此 GetAlerts(((例如停止小部件单击事件(

按需调用此的正确方法是什么,以便

  1. 保留 30 秒循环(或在按需插入后重新启动(
  2. 我最终不会运行多个setTimeout循环
  3. 我不会复制大量的代码(因为有很多 DOM 的东西发生在成功的内心

我尝试过的事情,例如按名称调用函数,尝试将超时设置为全局变量并停止超时,都失败了上述几点之一,或者根本没有调用。

setTimeout移动到success处理程序,并使用clearTimeout保持单循环运行。

具有公共.poll方法的类可能会有所帮助:

function AlertManager() {
    var successCallback = function (data) {
        // Private ajax success handler
        //do DOM stuff with data 
        $('#responses').append('Polled!<br/>');
    },
    _poll = function () {
        $.ajax({
            url: "/echo/json/",
            success: successCallback,
            complete: function () {
                timeoutId = setTimeout(_poll, timeoutMs);
            }
        });
    },
    timeoutId,
    timeoutMs = 5000;
    this.poll = function () {
        clearTimeout(timeoutId);
        _poll();
    };
}

看看小提琴演示:http://jsfiddle.net/neustroev_ai/64on18zg/

希望这有帮助!