gpt4 book ai didi

javascript - 多次调用setInterval然后清除间隔,轮询没有停止

转载 作者:行者123 更新时间:2023-12-03 00:54:39 25 4
gpt4 key购买 nike

由于我的循环太快,间隔重叠并且无法停止一个timerId。这是我的代码:

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 //

Jbin

try {
var 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 //



execute(data);

function execute(data) {
var i = 0;
scanSimulatorWithADelay(data, i);
}

function scanSimulatorWithADelay(data, i) {
setTimeout(function () {
getJobDetailsByCallingAPI(data[i], i);
i++;

if (data.length > i) {
scanSimulatorWithADelay(data, i);
} else {
i = 0;
}
}, scan_delay);
}

function getJobDetailsByCallingAPI(jobNumber, index) {

scannedItemsList.push(jobNumber);

//poll_for_jobs_count_which_are_scanned_but_waiting_to_add_to_table
startPolling();

//Simulate API to get response after every 3 seconds//
var apiDelay = (index + 1) * 3000;
setTimeout(function () {
console.log('API CALLED AT ' + new Date().toLocaleTimeString());
CallTheAPI(jobNumber);
}, apiDelay);

}

function CallTheAPI(jobNumber) {
console.log("JOB NO " + jobNumber + " API response Recd");
tableDataList.push(jobNumber);

}

function startPolling() {
var pollStatus = '';
timerId = setInterval(() => {
debugger;
console.log('timerId when starting interval ' + timerId);
var jobsWhichAreScannedButNotLoaded = jobsWhichAreScannedButNotLoadedStill();
console.log("$$$$$$ jobsWhichAreScannedButNotLoaded = " + jobsWhichAreScannedButNotLoaded.length);
if (jobsWhichAreScannedButNotLoaded.length === 0) {
console.log("@@@ Inteval Cleared @@@ " + timerId);

//CLEAR TIMER
clearInterval(timerId);

} else {
pollStatus = 'Polling inprogress and the pollID ' + timerId;
}
console.log('####' + pollStatus);
}, 2000);

}

function jobsWhichAreScannedButNotLoadedStill() {
let stillLoadingJobs = [];

scannedItemsList.forEach(scannedItemsListJobNumber => {
let foundJobInsideTable = false;
if (scannedItemsListJobNumber) {
foundJobInsideTable = tableDataList.indexOf(scannedItemsListJobNumber) > -1;
if (!foundJobInsideTable) {
stillLoadingJobs.push(scannedItemsListJobNumber);
}
}

}); // End of scannedItemsList forEach loop

if (stillLoadingJobs.length > 0) {
return stillLoadingJobs;
}

return [];
}
} catch (error) { throw error; }

最佳答案

您的 timer_id 变量位于全局范围内,因此每次调用 startPolling 时都会被覆盖。

因此,当您调用 clearInterval(timer_id) 时,timer_id 将是最后一个 setInterval 的 id,而第一个将是继续无休止地奔跑。

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

try {var data = ['115536', '117202'];

var scan_delay = 500;
// remove this one
//var timerId;

var scannedItemsList = [];
var tableDataList = [];



execute(data);

function execute(data) {
var i = 0;
scanSimulatorWithADelay(data, i);
}

function scanSimulatorWithADelay(data, i) {
setTimeout(function () {
getJobDetailsByCallingAPI(data[i], i);
i++;

if (data.length > i) {
scanSimulatorWithADelay(data, i);
} else {
i = 0;
}
}, scan_delay);
}

function getJobDetailsByCallingAPI(jobNumber, index) {

scannedItemsList.push(jobNumber);

//poll_for_jobs_count_which_are_scanned_but_waiting_to_add_to_table
startPolling();

//Simulate API to get response after every 3 seconds//
var apiDelay = (index + 1) * 3000;
setTimeout(function () {
console.log('API CALLED AT ' + new Date().toLocaleTimeString());
CallTheAPI(jobNumber);
}, apiDelay) ;

}

function CallTheAPI(jobNumber) {
$.ajax({
url: "https://jsonplaceholder.typicode.com/todos/1",
type: "GET",
async: true,
success: function (response) {
console.log("JOB NO " + jobNumber + " API response Recd");
tableDataList.push(jobNumber);
}
});

}

function startPolling() {
var pollStatus = '';
/////////
///HERE
/////////
// Declare timerId in startPolling scope
/////////
var timerId = setInterval(() => {
debugger;
console.log('timerId when starting interval '+ timerId);
var jobsWhichAreScannedButNotLoaded = jobsWhichAreScannedButNotLoadedStill();
console.log("$$$$$$ jobsWhichAreScannedButNotLoaded = "+ jobsWhichAreScannedButNotLoaded.length);
if (jobsWhichAreScannedButNotLoaded.length === 0) {
console.log("@@@ Inteval Cleared @@@ "+ timerId);

//CLEAR TIMER
clearInterval(timerId);

} else {
pollStatus = 'Polling inprogress and the pollID ' + timerId;
}
console.log('####' + pollStatus);
}, 2000);

}

function jobsWhichAreScannedButNotLoadedStill() {
let stillLoadingJobs = [];

scannedItemsList.forEach(scannedItemsListJobNumber => {
let foundJobInsideTable = false;
if (scannedItemsListJobNumber) {
foundJobInsideTable = tableDataList.indexOf(scannedItemsListJobNumber) > -1;
if (!foundJobInsideTable) {
stillLoadingJobs.push(scannedItemsListJobNumber);
}
}

}); // End of scannedItemsList forEach loop

if (stillLoadingJobs.length > 0) {
return stillLoadingJobs;
}

return [];
}
} catch (error) { throw error; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

关于javascript - 多次调用setInterval然后清除间隔,轮询没有停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52886659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com