2013-01-16 2 views
0

미안이 목표로하는 스크립트를 만들려고 노력 중지에서는 setTimeout : 새로운 질서가있는 경우가 나던

  1. 확인 모든 X의 초 (기능 refreshIntervalId())
  2. 새가있는 경우 순서 (기능 refreshIntervalId2())와 시작하는 다른 함수에서 일부 작업을 수행 setTimeover
  3. 을 중지 드 setTimeover 다시

이 코드로 작동하지만, 타이머가 정지 결코 그것이 간부 유지하는 것이 달성 5 초마다 소리내어 읽는다.

어떻게 해결할 수 있는지 알고 계십니까? 사전

var refreshIntervalId, refreshIntervalId2; 

    $("input:text:visible:first").focus(); 

    refreshIntervalId2 = (function() { 
    return { 
     update: function() { 
     var pedidoid, url; 
     clearInterval(refreshIntervalId); 
     pedidoid = $("#pedidoid").val(); 
     url = Routing.generate("get_pedido", { 
      id: pedidoid 
     }); 
     return $.getJSON(url, function(json) { 
      clearInterval(refreshIntervalId2); 
      if (json.entregado === 1) { 
      return location.reload(true); 
      } 
     }); 
     } 
    }; 
    })(); 

    refreshIntervalId = (function() { 
    return { 
     update: function() { 
     var url; 
     url = Routing.generate("get_pedidos"); 
     return $.getJSON(url, function(json) { 
      var imgsrc; 
      clearInterval(refreshIntervalId); 
      $(".hero-unit").children("h1").text("Pedido nuevo!"); 
      $(".hero-unit").children("h2").text(""); 
      imgsrc = "/images/uploads/" + json.pedido.material.foto; 
      $("#imagenpedidomaterial").attr("src", imgsrc); 
      $(".cajapuesto").css({ 
      position: "absolute", 
      top: json.pedido.puesto.y + "px", 
      left: json.pedido.puesto.x + "px" 
      }); 
      $(".cajapuesto").addClass(json.kolorea); 
      $("#divimagenmaterial").show("slow"); 
      $("#divcodbar").show("slow"); 
      $("#pedidoid").val(json.pedido.id); 
      return setInterval(refreshIntervalId2.update, 5000); 
     }); 
     } 
    }; 
    })(); 

    $(document).ready(function() { 
    return setInterval(refreshIntervalId.update, 5000); 
    }); 

    $(document.body).on("keypress", function(e) { 
    var $micodbar, url; 
    switch (e.which) { 
     case 13: 
     $("#divmaterialincorrecto").hide(); 
     $micodbar = $("#checkcodbar").val(); 
     url = Routing.generate("get_material", { 
      codbar: $micodbar 
     }); 
     return $.ajax(url, { 
      type: "GET", 
      contentType: "application/json", 
      success: function(data) { 
      var datos; 
      if (data === "null") { 
       return $("#divmaterialincorrecto").show("slow"); 
      } else { 
       datos = jQuery.parseJSON(data); 
       return $(".row").show("slow"); 
      } 
      }, 
      error: function(xhr, ajaxOptions, thrownError) { 
      console.log("Errorea"); 
      alert(xhr.status); 
      return alert(thrownError); 
      } 
     }); 
    } 
    }); 

답변

4

refreshIntervalIdrefreshIntervalId2 내가 생각하는 방법 update를 포함하는 객체에 대한 참조가 타이머에 대한 참조가 아니라 있습니다 때문입니다에 감사 목적에 네임 스페이스 있습니다.

clearInterval은 타이머를 인수로 필요로하며 이는 setInterval 호출의 반환 값에서 얻을 수 있습니다.

당신은 미래의 청산을 위해 타이머를 참조하기 위해이 코드 형식을 만족해야

:

이 같은 구조
//myTimer is a reference to your timer created by setInterval. 
var myTimer = setInterval(func,interval); 

//to clear myTimer, pass it to clearInterval 
clearInterval(myTimer); 

뭔가가 충분해야합니다

$(document).ready(function() { 
    var firstInterval 
    , secondInterval 
    ; 

    //if you are not creating local scopes, I suggest ditching the IFFE 
    //and go for a literal object instead. 
    var refreshIntervalId = { 
    update : function(){ 
     ... 
     return $.getJSON(url, function(json) { 
     ... 
     clearInterval(firstInterval); 
     ... 
     }); 
     ... 
    } 
    }; 

    //run refreshIntervalId.update every 5 seconds 
    //timer referenced by firstInterval 
    firstInterval = setInterval(refreshIntervalId.update, 5000); 
}); 
옆으로 그냥

, 당신의 keypress 핸들러는 조작되기 전에 DOM 요소가로드되는지 확인하려면 $(document).ready()이어야합니다.

+0

Ey! 감사! 나는 변화를 만들고 작동하지만 지금은 또 다른 문제가있다. json 변수는 비어있다. getJSON 호출을 수행 할 때까지 기다리지 않는다. 코드 안에 항상 들어간다. http://pastebin.com/4nf7xbb9 – ikerib

+0

@ ikerib 이것은 아마 AJAX의 비동기 적 특성 때문일 수 있습니다. 이것은 다른 질문에 유용 할 수 있습니다. – Joseph

+0

문제가 백엔드 내에 있습니다. 모두에게 감사드립니다! – ikerib