現在一度呼び出している 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>
エントリ配列を更新しないように見えるため、これはまだ機能しません。