繁体   English   中英

jQuery IIFE,按需插入吗?

[英]jQuery IIFE, interject on demand?

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

这很好。

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

我将要做的事情(例如停止小部件)将其写入警报队列。 因此,这应立即触发警报显示,而无需等待长达30秒的时间来触发它。 (由于服务器的限制,不允许选择套接字和长时间轮询)

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

什么是按需调用此电话的正确方法是

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

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

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

具有public .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/

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM