开始刷新javascript函数,然后停止它们并重新刷新它们

开始刷新javascript函数,然后停止它们并重新刷新它们,javascript,html,jquery,Javascript,Html,Jquery,我会尽力把我的问题解释清楚。 所以我制作了一系列javascript函数来显示一个值,为了使这些值保持最新,我需要一个时间间隔来刷新函数 这些是我的时间间隔中的函数 var interval = null; //make global variable for interval function refresh(){ // create a function that contains all the functions that need to be refreshed so I

我会尽力把我的问题解释清楚。 所以我制作了一系列javascript函数来显示一个值,为了使这些值保持最新,我需要一个时间间隔来刷新函数

这些是我的时间间隔中的函数

var interval = null; //make global variable for interval

function refresh(){      // create a function that contains all the functions that need to be refreshed so I can pass this function to my setInterval
        g1.refresh(linearScaling(0, 32761 , 0 , 10, readData('IW0')));
        showAnalogText('textonly', 'IW0');
        g2.refresh(linearScaling(0, 32761 , 0 , 10, readData('IW1')));
        showAnalogText('textonly2', 'IW1');
        showDigInputImg('light1', 'IX2.0', '/imgs/lightON.png', '/imgs/lightOFF.png');
        showDigInputImg('light2', 'IX2.1', '/imgs/lightON.png', '/imgs/lightOFF.png');
        showDigInputBool('led1', 'IX2.0', 'radio');
        showDigInputBool('led2', 'IX2.1', 'radio');
        showDigInputBool('boolean1', 'IX2.0', 'bool');
        showDigInputBool('boolean2', 'IX2.1', 'bool');
        showDigInputBool('text1', 'IX2.0', 'text');
        showDigInputBool('text2', 'IX2.1', 'text');
        showDigInputImg('output1', 'QX2.0', '/imgs/lightON.png', '/imgs/lightOFF.png');
        showDigInputImg('output2', 'QX2.1', '/imgs/lightON.png', '/imgs/lightOFF.png');
        }, 1000)
因此,这些函数需要不断更新,它们使用ajax执行读取请求,但我也有写入函数,我想要完成的是,每当我执行写入函数时停止间隔,这样ajax请求停止,我就可以执行写入请求,当写入完成时,它会重新启动间隔

以下是我的启动和停止功能:

        function startRefresh(){  //needs to be declared in my library but the function refresh() doesn't exist in library
        if (!interval){
            interval = setInterval(refresh, 1000);
        }
    }

    function stopRefresh(){  

            clearInterval(interval);
            interval = null;
    }
我知道这是可行的,但问题是我正在构建一个库,以便用户可以重新使用我的函数供自己使用,因此startrefresh和stoprefresh函数将在库中,但startrefresh函数需要refresh()(包含所有其他函数),但refresh只能在HTML页面本身的javascript中声明(不在库中)因为函数refresh包含在运行时创建的g1和g2等对象,所以我不能在库中声明refresh(),因为它包含的对象还不存在

有人能帮我找到一个简单的解决方案吗?你可以随心所欲地修改,我只想要一种最有效的方式,用户可以将需要刷新的所有函数放在一个间隔内,然后在我执行写入时停止并启动间隔,但停止和开始刷新函数需要在库中,用户不应该看到开始和结束stopfunction,它们在我的write函数中被调用。 希望有人能理解这一点,并帮助我,我将非常感激,如果你需要更多的解释,我很高兴给你

也许把所有函数放在某种变量中,然后把变量传递给我的startrefresh函数,这样行吗


Peace,Stijn

为什么不使用函数作为
startRefresh的参数

function startRefresh(refresh) {
    if (!interval){
        interval = setInterval(refresh, 1000);
    }
}
因此,您可以使用匿名函数运行该函数

startRefresh(function() {
   //do stuff to be refreshed
});
或者在您的情况下,您也可以将刷新功能存储在匿名函数中

startRefresh(function(){
    g1.refresh(linearScaling(0, 32761 , 0 , 10, readData('IW0')));
    showAnalogText('textonly', 'IW0');
    g2.refresh(linearScaling(0, 32761 , 0 , 10, readData('IW1')));
    showAnalogText('textonly2', 'IW1');
    showDigInputImg('light1', 'IX2.0', '/imgs/lightON.png', '/imgs/lightOFF.png');
    showDigInputImg('light2', 'IX2.1', '/imgs/lightON.png', '/imgs/lightOFF.png');
    showDigInputBool('led1', 'IX2.0', 'radio');
    showDigInputBool('led2', 'IX2.1', 'radio');
    showDigInputBool('boolean1', 'IX2.0', 'bool');
    showDigInputBool('boolean2', 'IX2.1', 'bool');
    showDigInputBool('text1', 'IX2.0', 'text');
    showDigInputBool('text2', 'IX2.1', 'text');
    showDigInputImg('output1', 'QX2.0', '/imgs/lightON.png', '/imgs/lightOFF.png');
    showDigInputImg('output2', 'QX2.1', '/imgs/lightON.png', '/imgs/lightOFF.png');
    }, 1000)
});
更新

function makeStartRefresher(refresh) {
    return function() {
        if (!interval){
            interval = setInterval(refresh, 1000);
        }
    }
}
您可以通过以下方式使用此功能:

var startRefresh = makeStartRefresher(function() {
    g1.refresh(linearScaling(0, 32761 , 0 , 10, readData('IW0')));
    showAnalogText('textonly', 'IW0');
    g2.refresh(linearScaling(0, 32761 , 0 , 10, readData('IW1')));
    showAnalogText('textonly2', 'IW1');
    showDigInputImg('light1', 'IX2.0', '/imgs/lightON.png', '/imgs/lightOFF.png');
    showDigInputImg('light2', 'IX2.1', '/imgs/lightON.png', '/imgs/lightOFF.png');
    showDigInputBool('led1', 'IX2.0', 'radio');
    showDigInputBool('led2', 'IX2.1', 'radio');
    showDigInputBool('boolean1', 'IX2.0', 'bool');
    showDigInputBool('boolean2', 'IX2.1', 'bool');
    showDigInputBool('text1', 'IX2.0', 'text');
    showDigInputBool('text2', 'IX2.1', 'text');
    showDigInputImg('output1', 'QX2.0', '/imgs/lightON.png', '/imgs/lightOFF.png');
    showDigInputImg('output2', 'QX2.1', '/imgs/lightON.png', '/imgs/lightOFF.png');
    }, 1000)
});

这是有道理的,但问题是,我的库中有一个写函数,当单击按钮时会调用它,这是我的写函数“function writeData(adres,value){stopfresh();var url=getUrl();$.get(url+'/WRITEPI?ADR1='+adres+'&VALUE1='+value+'&FORMAT1=%d',function(data){});startRefresh(refresh); }所以问题是当调用writedata时,startrefresh最终会被调用,但我不能像你说的那样实现它,因为库中不存在像g1和g2这样的元素。很抱歉,如果你不能理解,我很难解释。你可以使用更高阶的函数,我会更新答案。哇,很好,我理解了,非常感谢,但我仍然有一个问题,当我创建变量“startrefresh”时,它是由“makestartrefresh”返回的函数,何时执行?在创建变量时是否调用它?是否可以将此变量传递给函数(即我的write函数)并在该函数中执行变量?我希望这样,无论何时执行写入操作(必须停止并重新启动间隔),都可以传递该变量因此,为了执行
startrefresh
函数,我不必在write函数中重新定义整个startrefresh变量,您需要执行与普通函数
startrefresh()相同的操作
您可以将变量和函数都传递给javascript中的其他函数。感谢您的大力帮助,我现在可以使用了:非常感谢