2012-05-05 2 views
0

나는 한 번 호출 한 getJSON 함수를 가지고 있으며 setInterval() 함수를 사용하여 값을 변경할 수있는 thingspeak.com 채널 피드를 수신합니다. 시각.getJSON 호출에서 반환 된 데이터가 변경되면 트리거 이벤트

리턴 된 데이터 field1의 값이 '1'일 때 getJSON 함수 외부의 jQuery 코드에서 이벤트를 트리거하려고합니다. 값이 '0'이면 이벤트를 해제해야합니다. 여태까지는 그런대로 잘됐다. 그러나 getJSON이 몇 초 간격으로 채널 피드를 듣고 있기 때문에 이벤트 (timer() 함수)가 반복해서 발생합니다.

getJSON 이벤트를 "백그라운드에서 실행 중"으로 설정하고 채널 피드에서 반환 된 데이터가 실제로 변경된 경우에만 어떻게 실행합니까? 반환 된 데이터에는 데이터 항목 (entry_id)의 고유 ID가있는 필드도 있으므로이 값의 변경을 수신 할 수 있습니다.

는 현재이 코드를 실행 : 업데이트하지 않습니다 보인다

$(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> 

이 여전히 작동하지 않습니다 여기에

$(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 
}    

하면 더 많은 정보를 될 수있는 코드의 두 번째 버전입니다 entries 배열.

+0

논리가 제게 의미가 없습니다. 데이터 필드가 1이면 'timer()'를 호출하고, 데이터가 0이면'timer() '를 호출합니다. 언제 ** timer() 함수를 트리거하지 않으시겠습니까? – montrealist

+0

달배를 완전히 동의합니다. 당신의 논리는 나에게도 의미가 없습니다. 400 밀리 초마다 json 객체가 변경되었는지 확인합니다. 그것이 바뀌면 타이머를 작동시키지 않을 것이고, 바뀌지 않으면 타이머를 멈추고 싶을 것입니다. 즉, getUpdates() 간격이 400 밀리 초마다 변경 사항을 계속 확인하기 때문에 타이머는 400 밀리 초 동안 만 실행됩니다. 이 타이머가 할 일에 대해 더 설명해 주시겠습니까? – Wezelkrozum

+0

의견에 감사드립니다. 당신은 직접 @Wezelkrozum 내 문제를 지적하고, 나는 이것이 잘못 될 수 있습니다. data.field1이 1이면 1 분 동안 실행해야하는 타이머를 시작하고 싶습니다. 해당 시간의 field1 값이 0으로 변경되면 타이머를 중지하고 싶습니다. 문제는 이제 새로운 타이머의 코드 세트가 각각 400ms입니다. 처음에는 field1이 1로 설정되고 다시 field1이 0으로 설정된 다음 다시 1로 설정되기를 원할 때만 필요합니다. 말이 돼? – user1376918

답변

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);  
}); 
관련 문제