0

現在一度呼び出している getJSON 関数があり、次に setInterval() 関数を使用して、いつでも値を変更できる thingspeak.com チャネル フィードをリッスンします。

返されたデータ field1 の値が '1' の場合、getJSON 関数の外部で、jQuery コードでイベントをトリガーしたいと考えています。値が「0」の場合、イベントをオフにする必要があります。ここまでは順調ですね。しかし、getJSON は数秒間隔でチャネル フィードをリッスンしているため、イベント (timer() 関数) を何度も発生させます。

getJSON イベントを「バックグラウンドで実行」し、チャネル フィードから返されたデータが実際に変更された場合にのみ発生させるにはどうすればよいですか? 返されるデータには、データ エントリの一意の ID (entry_id) を持つフィールドも含まれているため、この値の変更をリッスンすることができます。

現在このコードを実行しています:

$(document).ready(function() {
    getUpdates();
    setInterval('getUpdates()',400);
});

function getUpdates() {
    $.getJSON('http://api.thingspeak.com/channels/xxx/feed/last.json?callback=?', {key: "xxx"}, function(data) {
    if(data.field1 == '1') {
        // trigger timer function on
    } else if(data.field1 == '0') {
        // trigger timer function off
    }
});

function timer() {
    // Starts a timer countdown in a div
}            

これは、より有益なコードの 2 番目のバージョンです。

$(document).ready(function() {
    getUpdates();
    setInterval('getUpdates()',400);    
});

function getUpdates() {
    var entries = new Array();
    $.getJSON('http://api.thingspeak.com/channels/xxx/feed/last.json?callback=?', {key: "xxx"}, function(data) {
        if ($.inArray(data.entry_id,entries) === -1) {
            //New entry, add the ID to the entries array
            entries.push(data.entry_id);

            //Check if the div should be visible or not
            if(data.field1 == '1') {
                $(".desc").show();
            } else if(data.field1 == '0') {
                $(".desc").hide();
            } 
        } else if ($.inArray(data.entry_id,entries) > -1) {
            // Same entry as previous call, do nothing.
        } 
    });
}

<div class="desc"></div>

エントリ配列を更新しないように見えるため、これはまだ機能しません。

4

1 に答える 1

0

これはおおよその、テストされていないロジックです(結局のところ、正しいデータを含むフィードにアクセスできません)。それがあなたを正しい方向に導くかどうか教えてください。

var timerSet = 0;

function startTimer(){
    timerSet = 1;
    // start the 1-minute timer and show feedback to user
}

function stopTimer(){
    timerSet = 0;
    // stop the 1-minute timer and show feedback to user
}

function getUpdates() {
    var entries = new Array();
    $.getJSON('http://api.thingspeak.com/channels/xxx/feed/last.json?callback=?', {key: "xxx"}, function(data) {
        if ($.inArray(data.entry_id,entries) === -1) {
            //New entry, add the ID to the entries array
            entries.push(data.entry_id);

            // check which state the system is in and manage the 1-minute timer
            if(data.field1 == '1' && timerSet === 0) { // if 1-minute timer not running already - start it
                startTimer();
            } else if(data.field1 == '0' && timerSet === 1) { // if 1-minute timer running already - stop it
                stopTimer();
            } 
        }
    });
}

$(document).ready(function() {
    // getUpdates(); don't need this: function will be called in 400ms anyway
    setInterval('getUpdates()',400);    
});
于 2012-05-05T18:32:38.907 に答える