2013-03-12 82 views
0

我会尽我所能清楚地解释我的问题。 所以我做了一堆显示值的javascript函数,并保持这些值是最新的,我需要一个间隔刷新功能。开始刷新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请求停止,我可以执行我的写入请求,写入完成后重新开始间隔。

这些都是我的启动和停止功能:

 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()(包含所有其他函数),但刷新只能在HTML页面本身的javascript中声明(不在库中),因为函数refresh包含对象作为在运行时创建的g1和g2,所以我不能在我的库中声明refresh(),因为它包含的对象还不存在。

任何人都可以帮助我得到一个简单的解决方案,U可以改变任何你想要的,我只是想用最有效的方式,用户可以把他需要的所有功能刷新一段时间,并停止并开始间隔时,我执行写操作,但stop和startrefresh函数需要在库中,用户不应该看到启动和停止功能,它们在我的写入函数中被调用。 希望有人能够理解这一点,并帮助我,我会非常感激,如果你需要更多的解释我很乐意给你

也许把所有的功能放在某种变量,并将该变量传递给我startrefresh功能,会工作吗?

和平,斯泰恩

回答

1

为什么不使用功能参数startRefresh

function startRefresh(refresh) { 
    if (!interval){ 
     interval = setInterval(refresh, 1000); 
    } 
} 

所以你可以使用匿名函数运行功能

startRefresh(function() { 
    //do stuff to be refreshed 
}); 

或你的情况,你会能够在anonymouse功能中存储刷新功能

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) 
}); 

UPDATE

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) 
}); 
+0

这是有道理的,但问题是,我有我的图书馆写函数被调用时,一个按钮被点击,这是我的写功能'\t \t函数writeData(adres,value){ \t \t \t \t \t \t stopRefresh(); \t \t \t var url = getUrl(); \t \t \t $ .get(url +'/ WRITEPI?ADR1 ='+ adres +'&VALUE1 ='+ value +'&FORMAT1 =%d',function(data){}); \t \t \t startRefresh(refresh); \t \t}' 所以问题是当writedata被调用时,startrefresh最终会被调用,但是我不能像你说的那样实现它,因为在库中像g1和g2这样的元素不存在。 对不起,如果你不明白,我很难解释。 – 2013-03-12 19:53:55

+0

你可以使用更高阶的函数,我会更新答案。 – jcubic 2013-03-12 19:57:18

+0

哇很好我明白了,非常感谢,但是我仍然有一个问题,当我创建变量'startrefresh'时,由'makeStartRefresher'返回的函数,何时执行?它是否在变量创建时被调用?是否有可能将此变量传递给一个函数(即我的写函数)并在该函数内执行该变量?我希望这样,以便在执行写入时(必须停止并重新启动时间间隔),我可以传递它,因此我不必在我的写入函数内重新定义整个startrefresh变量 – 2013-03-12 22:35:53