0

私の問題を明確に説明するために最善を尽くします。そのため、値を表示する一連の 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 関数には実行時に作成される g1 や g2 などのオブジェクトが含まれているため、refresh は HTML ページ自体の JavaScript でのみ (ライブラリではなく) 宣言できます。そのため、refresh を宣言することはできません。 () まだ存在しないオブジェクトが含まれているため、ライブラリに含まれています。

誰でも簡単な解決策を得るのを手伝ってもらえますか、Uは何でも変更できます。ユーザーが必要なすべての機能をインターバルでリフレッシュし、書き込みを実行するときにインターバルを停止および開始できる最も効率的な方法が欲しいだけです。しかし、stop 関数と startrefresh 関数はライブラリにある必要があります。ユーザーは start 関数と stop 関数を見ることは想定されていません。それらは私の書き込み関数で呼び出されます。誰かがこれを理解して助けてくれることを願っています。さらに説明が必要な場合は、喜んでお答えします。

すべての関数をある種の変数に入れて、その変数を startrefresh 関数に渡すとうまくいくでしょうか?

平和、ステイン

4

1 に答える 1

1

関数を引数として使用しない理由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)
});
于 2013-03-12T19:33:41.563 に答える