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

这很好。

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


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

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

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


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


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

最佳答案

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/

希望这可以帮助!

07-26 03:43