我有一个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/
希望这可以帮助!