Javascript clearInterval仅适用于页面上的一个setInterval

时间:2015-06-04 16:38:38

标签: javascript jquery setinterval clearinterval

在一个对象(程序集)中,我有两个属性(check& blipbg)

我为每一个都开了2个setInterval。

当我在每个上面调用clearInterval时,只有一个工作:clearInterval(assembly.checkinterval);

clearInterval(assembly.blipinterval);不起作用,并且随机地继续运行几个周期并停止,或者无法正常运行。

范围问题?但是为什么一个人正在工作呢?

<script>
    $(document).ready(function () {

        var zipli = $('.zipli');
        var actionlink = $('.actionlink');
        var zip_asset_url = $('.asseturl');
        var csrftoken = '{{ csrf_token }}';
        var zip_status_url = $('.statusurl');


        zipli.on("click", function(e){
            e.preventDefault();

            zipli.html('<a href="" class="waitlink">Demande de création de fichier zip - Ne fermez pas la fenêtre');
            zipli.addClass('disabled');

            assembly.order();

        });


        assembly = {};

        assembly.order = function(){
            $.ajax({
                context: this,
                url: zip_asset_url,
                type : "POST",
                data: {csrfmiddlewaretoken: csrftoken},
                success: function (resp) {

                    assembly_url = resp.assembly_url;

                    zipli.html('<a href="" class="waitlink">Fichier zip en cours de création - Ne fermez pas la fenêtre');
                    waitlink =  $('.waitlink');

                    assembly.checkinterval = setInterval(assembly.check,1000);
                    assembly.blipinterval = setInterval(assembly.blipbg,1000);

                    console.log("assembly.order success"+resp);
                },
                error:function(resp){
                    $('.waitlink').html("Erreur lors de la demande de création d'archive - Rechargez la page ?");
                    console.log("assemby.order error"+resp);
                }
            });
        };

        assembly.blipbg = function (){
            $('.zipli a').animate({'color': '#eee'}, 500).animate({'color': '#999'}, 500);
        };

        assembly.check = function(){

            $.ajax({
                context: this,
                url: zip_status_url,
                type : "POST", // http method
                data: {assembly_url:assembly_url,csrfmiddlewaretoken: csrftoken},
                success: function (resp) {

                    if (resp.ok == "ASSEMBLY_COMPLETED"){
                        clearInterval(assembly.checkinterval);
                        clearInterval(assembly.blipinterval);

                        zipli.remove();
                        $('.zipul').html('<li class="pull-right"><a href="" class="finallink"> Fichier zip prêt : Téléchargez</a></li>');
                        $('.finallink').attr("href",resp.results.archive[0].ssl_url);

                    }
                    else if (resp.error){
                        console.log("assembly.check resp.error error : %o", resp);
                        clearInterval(assembly.checkinterval);
                        clearInterval(assembly.blipinterval);

                        $('.waitlink').html("Erreur lors de la préparation de l'archive : "+resp.error).animate({'color': 'red'}, 300);

                    }else{
                        console.log("zipnoready");
                    }

                },
                error:function(resp){
                    $('.waitlink').html("Erreur lors de la vérification du process: %o", resp);

                }
            });
        }

    });
</script>

2 个答案:

答案 0 :(得分:1)

在调用setInterval之前,请调用clearInterval。

&#13;
&#13;
clearInterval(assembly.checkinterval);
assembly.checkinterval = setInterval(assembly.check,1000);
clearInterval(assembly.blipinterval);
assembly.blipinterval = setInterval(assembly.blipbg,1000);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

在这种情况下,它可能不是范围问题,但是通过多次调用order()来覆盖引用ID。

ID是唯一的,在后台运行的setInterval必须清除 ID。

如果调用order(),则存在覆盖旧id的风险,因此clearInterval将仅清除最原因的计时器,而旧的仍将运行。

请考虑使用回调来避免这种情况。