Javascript 多次调用setInterval,然后清除interval,轮询未停止

Javascript 多次调用setInterval,然后清除interval,轮询未停止,javascript,setinterval,polling,Javascript,Setinterval,Polling,由于我的循环太快,间隔重叠,一次也停不下来。这是我的密码: data = ['115536', '117202']; // BARCODES AVAILABLE ON A4 SHEET // var scan_delay = 500; // USER AVG SCANNING SPEED PER BARCODE // var timerId; var scannedItemsList = []; // ITEMS WHICH ARE SCANNED BY SEEING A4 SHEET BY

由于我的循环太快,间隔重叠,一次也停不下来。这是我的密码:

data = ['115536', '117202']; // BARCODES AVAILABLE ON A4 SHEET //

var scan_delay = 500; // USER AVG SCANNING SPEED PER BARCODE //
var timerId;

var scannedItemsList = []; // ITEMS WHICH ARE SCANNED BY SEEING A4 SHEET BY THE USER //
var tableDataList = []; // TO SHOW DATA WHICH WE GOT FROM API //

试试看{
var data=['115536','117202'];//条形码可在A4纸上找到//
var scan_delay=500;//每个条形码的用户平均扫描速度//
var-timerId;
var scannedItemsList=[];//用户通过查看A4纸扫描的项目//
var tableDataList=[];//显示从API获取的数据//
执行(数据);
函数执行(数据){
var i=0;
带显示的扫描模拟器(数据,i);
}
带显示的功能扫描模拟器(数据,i){
setTimeout(函数(){
getJobDetailsByCallingAPI(数据[i],i);
i++;
如果(data.length>i){
带显示的扫描模拟器(数据,i);
}否则{
i=0;
}
},扫描延迟);
}
函数getJobDetailsByCallingAPI(作业编号、索引){
scannedItemsList.push(作业编号);
//轮询\u以查找\u作业\u计数\u哪些\u已扫描\u但\u正在等待\u将\u添加到\u表中
startPolling();
//模拟API以在每3秒后获得响应//
var apiDelay=(指数+1)*3000;
setTimeout(函数(){
log('API在'+new Date().toLocaleTimeString()调用);
调用API(作业编号);
}(延迟),;
}
函数CallTheAPI(作业编号){
控制台日志(“作业编号”+作业编号+“API响应记录”);
tableDataList.push(作业编号);
}
函数startPolling(){
var pollStatus='';
timerId=setInterval(()=>{
调试器;
console.log('启动间隔时的timerId'+timerId);
var jobsWhichAreScannedButNotLoaded=jobswhicharescannedbutnotloadedshill();
console.log(“$$$$$$jobsWhichAreScannedButNotLoaded=“+jobsWhichAreScannedButNotLoaded.length”);
if(作业已扫描但未加载。长度==0){
console.log(“@@@Inteval@@@@”+timerId);
//清除计时器
清除间隔(timerId);
}否则{
pollStatus='pollinginprogress和pollID'+timerId;
}
console.log(“####”+pollStatus);
}, 2000);
}
函数jobswhichharescannedButnotLoadedStill(){
让stillLoadingJobs=[];
scannedItemsList.forEach(scannedItemsListJobNumber=>{
让foundJobInsideTable=false;
if(scannedItemsListJobNumber){
foundJobInsideTable=tableDataList.indexOf(scannedItemsListJobNumber)>-1;
如果(!foundJobInsideTable){
仍然加载作业。推送(scannedItemsListJobNumber);
}
}
});//scannedItemsList forEach循环的结束
如果(stillLoadingJobs.length>0){
返回静态加载作业;
}
返回[];
}

}catch(error){throw error;}
您的
timer\u id
变量位于全局范围内,因此每次调用
startPolling
时都会被覆盖

因此,当您调用
clearInterval(timer\u id)
时,
timer\u id
将是最后一个
setInterval
的id,而第一个将无休止地运行

只需在
startPolling
函数中添加一个
var
,即可正确确定
timer\u id
的范围,并且不会被下一次调用覆盖

试试{var data=['115536','117202'];
var扫描延迟=500;
//把这个拿走
//var-timerId;
var scannedItemsList=[];
var tableDataList=[];
执行(数据);
函数执行(数据){
var i=0;
带显示的扫描模拟器(数据,i);
}
带显示的功能扫描模拟器(数据,i){
setTimeout(函数(){
getJobDetailsByCallingAPI(数据[i],i);
i++;
如果(data.length>i){
带显示的扫描模拟器(数据,i);
}否则{
i=0;
}
},扫描延迟);
}
函数getJobDetailsByCallingAPI(作业编号、索引){
scannedItemsList.push(作业编号);
//轮询\u以查找\u作业\u计数\u哪些\u已扫描\u但\u正在等待\u将\u添加到\u表中
startPolling();
//模拟API以在每3秒后获得响应//
var apiDelay=(指数+1)*3000;
setTimeout(函数(){
log('API在'+new Date().toLocaleTimeString()调用);
调用API(作业编号);
}(延迟),;
}
函数CallTheAPI(作业编号){
$.ajax({
url:“https://jsonplaceholder.typicode.com/todos/1",
键入:“获取”,
async:true,
成功:功能(响应){
控制台日志(“作业编号”+作业编号+“API响应记录”);
tableDataList.push(作业编号);
}
});
}
函数startPolling(){
var pollStatus='';
/////////
///这里
/////////
//在startPolling作用域中声明timerId
/////////
var timerId=setInterval(()=>{
调试器;
console.log('启动间隔时的timerId'+timerId);
var jobsWhichAreScannedButNotLoaded=jobswhicharescannedbutnotloadedshill();
console.log(“$$$$$$jobsWhichAreScannedButNotLoaded=“+jobsWhichAreScannedButNotLoaded.length”);
if(作业已扫描但未加载。长度==0){
console.log(“@@@Inteval@@@@”+timerId);
//清除计时器
清除间隔(timerId);
}否则{
pollStatus='pollinginprogress和pollID'+timerId;
}
console.log(“####”+pollStatus);
}, 2000);
}
函数jobswhichharescannedButnotLoadedStill(){
让stillLoadingJobs=[];
scannedItemsList.forEach(scannedItemsListJobNumber=>{
让foundJobInsideTable=false;
if(scannedItemsListJobNumber){
foundJobInsideTable=tableDataList.indexOf(scannedItemsListJobNumber)>-1;
如果(!foundJobInsideTable){
仍然加载作业。推送(scannedItemsListJobNumber);
}
}
});//scannedItemsList forEach循环的结束
如果(stillLoadingJobs.length>0){
返回静态加载作业;
}
返回[];
}
}catch(error){throw error;}

这就是为什么不应该使用
setInterval()
。改为使用
setTimeout()
,并在函数执行后递归调用它。如果我导航到另一个页面,