0

我正在尝试制作具有此目标的脚本:

  1. 如果有新订单,每 X 秒检查一次(函数 refreshIntervalId())
  2. 如果有新订单,停止 setTimeover
  3. 在另一个函数(函数 refreshIntervalId2() )中执行一些操作并再次启动 de 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

1 回答 1

4

这是因为refreshIntervalId并且refreshIntervalId2不是对您的计时器的引用,而是对包含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处理程序应该$(document).ready()确保在操作 DOM 元素之前加载它们。

于 2013-01-16T11:42:48.793 回答