2014-09-16 3 views
2

For 루프에 문제가 있습니다. 어떤 이유로 정확하게 타이밍이 맞지 않습니다. 저는 5 초마다 내 '외계인'을 클릭하게됩니다 (코드에서 보게 될 것입니다). 그리고 당신이 노동자를 살 때마다 늘려야합니다. 따라서 근로자가 2 명인 경우 5 초당 2 명의 외계인, 3 초 동안 3 명의 외계인 등이 있습니다. 그러나 2 명 이상의 직원이있을 때 모든 직원에 대해 두 번 외계인을 클릭하려는 것처럼 작동합니다.For 루프의 시간이 잘못되었습니다. 무엇이 문제입니까?

내가 원하는 무엇 : 한 노동자가 자동으로 // 2 근로자 5 초 이내에 자동 에 두 번 클릭 = 5 초당 한 번 클릭 = 등

가 잘못 기능 : 한 노동자가 나는 방법을 작동// 2 근로자 5 초 이내에 자동에 두 번 클릭 = 클릭 할 때마다 가치가 여기에

루프에 대한 실행 변수 등이 :

var workerCheck = setInterval(function(){ 
     var workers = parseInt($("#Workers").text()); 
      if(workers > 0){ 
       for(var i = 0; i < workers; i++){ 
       $("#Alien").click();  
       } 
      } 
    },5000); 
가 6,

가 여기 내 전체 코드에 페이스트 빈 링크입니다 : http://pastebin.com/ApwQgG4w

내 질문은 의미가 희망 I 예를 들어 2 명 근로자는 4 5 초마다에 '외계인'값을 설정합니다 가지고 있으며 나는 단지 2를 원하는 경우, 3의 경우 3 초 외계인이 9 초가 아니라 5 초가 필요합니다.

+0

당신이 질문에 제공 한 코드는 문제를 재현하기에 충분하지 않습니다. 문제를 재현 할 수있는 최소한의 예를 제공하기 위해 질문을 편집 한 경우 (귀하와 당사 모두에게) 도움이 될 것입니다. 이렇게하면 버그를 발견 할 가능성이 있습니다. –

+0

재설정하기 전에'workerCheck' 간격을 지울 필요가있을 것 같습니다. 그렇지 않으면 코드가 근로자를 고용 할 때마다 다른 타이머가 추가됩니다. ['clearInterval()'] (https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.clearInterval). – showdev

+0

@TomFenech 이해가 안 되니? 내가 제공 한 코드는 내가 가진 전부입니다.나는 그것이 왜 고장 났는지 알아 내려고하고있다. 2 명의 직원이있을 때 2 명이 외국인 카운터에 추가되지만 2 초마다 2 번합니다. 그래서 5 초 만에 내가 원하는대로 2 대신에 4로 끝날 것입니다. 이것은 과거의 모든 일에 일어납니다. – Cosmicluck

답변

3

재설정하기 전에 간격을 지워야 할 수 있습니다.

"근로자 고용"을 두 번 클릭하면 두 개의 타이머가 만들어집니다. 여기에 demonstration이 있습니다. 버튼을 클릭 한 횟수에 관계없이 하나의 타이머 만 필요합니다.

setTimer()을 호출하면 나중에 해당 타이머를 참조하는 데 사용할 수있는 고유 한 정수를 반환합니다. 타이머의 고유 한 정수로 항상 동일한 변수 workerCheck을 설정 (덮어 쓰기)하므로 workerCheck 변수로 최신 타이머 만 참조 할 수 있습니다. 여기에 demonstration이 있습니다.

당신이 그것을 다시 당신이 타이머 매번 삭제하는 것이 좋습니다 :

$(function() { 
    $('#Purchase').click(function() { 
     automaticCounter(); 
    }); 

    // set variable with broader scope 
    var workerCheck; 

    function automaticCounter() { 
     var workers = parseInt($("#Workers").text()); 
     workers = isNaN(workers) ? 0 : ++workers; 

     $("#Workers").text(workers); 

     var autoCounter = parseInt($("#Aliens").text()); 
     autoCounter = isNaN(autoCounter) ? 0 : autoCounter - 10 * workers; 

     $("#Aliens").text(autoCounter); 

     // clear the timer 
     clearInterval(workerCheck); 

     // set the timer 
     workerCheck = setInterval(function() { 
      var workers = parseInt($("#Workers").text()); 
      if (workers > 0) { 
       for (var i = 0; i < workers; i++) { 
        $("#Alien").click(); 
       } 
      } 
     }, 5000); 
    } 
}); 

WORKING EXAMPLE

+0

http://jsfiddle.net/3z3765yn/에서 비슷한 바이올린 실제 차이점은 초기화되지 않은 값에 의존하기보다는 workerCheck 변수에 대해 null을 확인하고 설정하는 것입니다. – ssnobody

1

나는 그것이 올바르게 이해되기를 바랍니다. FIDDLE

코드 편집 해하고 현재 작업이 : FIDDLE

var workers = 0; 
var workerCheck = setInterval(function(){ 
    workers = parseInt($("#workers").val()); 
     if(workers > 0){ 
      for(var i = 0; i < workers; i++){ 
      $("#Alien").trigger('click');  
      } 
     } 
},1000); 

가 뭐죠 잘못된 코드에 : 나는 조금 지저분한 모르는 여기

는 작지만 멋진 당신을 위해 바이올린입니다 나는 그것을 편집하고 지금 일하고있다.

+0

차이점과 원래 코드의 문제점은 무엇입니까? –

+0

조금 더러워하지 말고 코드를 추가하고 수정하십시오. –

+0

두 번째 바이올린이 잘 작동하는 것 같습니다. 끊임없이 타이머가 작동하는 것처럼 보입니다. 실제로 버튼을 클릭 할 때 타이머를 설정하는 대신 전체 디스플레이를 업데이트하는 단일 전역 타이머를 갖는 것은 나쁜 생각이 아닙니다. 좀 더 청결한 것 같아. – showdev

관련 문제