2013-03-12 90 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