在一个对象(程序集)中,我有两个属性(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>
答案 0 :(得分:1)
在调用setInterval之前,请调用clearInterval。
clearInterval(assembly.checkinterval);
assembly.checkinterval = setInterval(assembly.check,1000);
clearInterval(assembly.blipinterval);
assembly.blipinterval = setInterval(assembly.blipbg,1000);
&#13;
答案 1 :(得分:1)
在这种情况下,它可能不是范围问题,但是通过多次调用order()来覆盖引用ID。
ID是唯一的,在后台运行的setInterval必须清除其 ID。
如果调用order(),则存在覆盖旧id的风险,因此clearInterval将仅清除最原因的计时器,而旧的仍将运行。
请考虑使用回调来避免这种情况。