函数根据设置间隔循环,但参数不同

function is looped according to setinterval but with different parameters

本文关键字:参数 循环 设置 函数      更新时间:2023-09-26

我有一个简单的问题,有一个带有参数emp_id的函数可以打开一个具有不同属性的聊天表单,我希望它每 10 秒自动刷新一次,现在它工作有点错误,因为有一个参数emp_id可以更改,一旦我更改它, 带有消息和表单的聊天刷新了两倍或三倍:)取决于你更改emp_id的次数,我希望我很清楚))无论如何,这是JavaScript函数:

function load_chat(emp_id) {
        var url = "#request.self#?fuseaction=objects2.popup_list_chatform"
        url = url + "&employee_id=" + emp_id;
        document.getElementById('form_div').style.display = 'block';                            AjaxPageLoad(url,'form_div',1,'Yükleniyor');
        setInterval( function() { 
            load_chat(emp_id); 
        },10000);
}

有一个名称列表,一旦我单击其中一个,这个表单就会通过这个功能打开,但是如果我点击另一个用户,我的意思是如果我更改emp_id,它会刷新,上一个和现在的表单。 如何更改它,以便它仅刷新最后一个emp_id,而不是我更改的所有 ID

谢谢大家的帮助,我真的很感激!

这将很好地概括您正在做的事情。计时器 ID ( tid ) 保存在闭包内,因此当您调用load_chat时,如果有一个正在运行,它将停止间隔。

设置新 url 后,它将再次启动间隔计时器。

var ChatModule = (function() {
    var tid,
    url;
    function refresh()
    {
        AjaxPageLoad(url, 'form_div', 1, 'Yükleniyor');
    }
    return {
        load_chat: function(emp_id) {
            if (tid) {
                clearInterval(tid);
            }
            // setup url
            url = "#request.self#?fuseaction=objects2.popup_list_chatform"
            url = url + "&employee_id=" + emp_id;
            document.getElementById('form_div').style.display = 'block';
            // load ajax
            refresh();
            // set timer
            tid = setInterval(refresh, 10000);
        }
    }
}());
ChatModule.load_chat(123);

改用setTimeout。每次执行函数时,它都会设置下一次执行(您也可以将其设置为条件):

function load_chat(emp_id) {
    ... // do something
    if (condition_still_met)
        setTimeout(function() { 
            load_chat(emp_id); // with same id
        }, 10000);
}
load_chat("x"); // to start

或者你将不得不在load_chat函数之外使用 setInterval。您可以在必要时清除间隔。

function get_chat_loader(emp_id) {
    return function() {
        ... // do something 
    };
}
var id = setInterval(get_chat_loader("x"), 10000); // start
// then, somewhen later:
clearInterval(id);