外部函数的 clearInterval 不起作用 - Node.JS
clearInterval of a external function not working - Node.JS
我有一个 setInterval 函数已在另一个函数中调用,我需要在处理完成后停止它。我尝试将此 setInterval 函数设置为变量并调用 clearInterval,但间隔保持 运行
const createInterval = (visibilityTimeout, startDateTime, message) => {
setInterval(() => {
const currentDateTime = moment().valueOf();
const timeDifference = (visibilityTimeout * 1000) - (currentDateTime - startDateTime);
if (timeDifference >= 600000) {
return;
}
if (timeDifference < 494983) {
const params = {
QueueUrl: 'http://localhost:4566/000000000000/test-queue2',
ReceiptHandle: message.ReceiptHandle,
VisibilityTimeout: visibilityTimeout,
};
sqs.changeMessageVisibility(params, (err, data) => {
if (err) logger.error(err, err.stack);
else logger.info(data);
});
// eslint-disable-next-line no-param-reassign
visibilityTimeout += 300;
}
}, 5000);
};
module.exports = async (message) => {
const startDateTime = moment().valueOf();
const {
noteId,
} = JSON.parse(message.Body);
logger.info(`Processing message [noteId=${noteId}]`);
try {
const note = await TestSessionNote.findById(noteId);
const testSession = await TestSession.findById(note.test_session_id);
logger.info(`Downloading video [key=${testSession.video_key}]`);
const isProcessing = true;
const interval = createInterval(500, startDateTime, message, isProcessing);
await sleep(20000);
clearInterval(interval);
logger.info(`Finished processing message [noteId=${noteId}]`);
} catch (ex) {
await TestSessionNote.update(noteId, { status: 'transcribe_error' });
logger.error(`Error processing message [noteId=${noteId}]`, ex);
}
};
我知道如果我创建一个 var test = setInterval(() => {console.log('blabla')}, 500) 并调用 clearInterval(test) 它会起作用,但我不知道我不知道如何通过调用函数来做到这一点
我认为你必须 return 从 createInterval 函数 intervalId 然后它应该工作。
你能检查一下你当前的 intervalId 值是多少吗?
https://developer.mozilla.org/en-US/docs/Web/API/setInterval
“returned intervalID 是一个数字非零值,用于标识调用 setInterval() 创建的计时器;可以将此值传递给 clearInterval() 以取消间隔。”
我有一个 setInterval 函数已在另一个函数中调用,我需要在处理完成后停止它。我尝试将此 setInterval 函数设置为变量并调用 clearInterval,但间隔保持 运行
const createInterval = (visibilityTimeout, startDateTime, message) => {
setInterval(() => {
const currentDateTime = moment().valueOf();
const timeDifference = (visibilityTimeout * 1000) - (currentDateTime - startDateTime);
if (timeDifference >= 600000) {
return;
}
if (timeDifference < 494983) {
const params = {
QueueUrl: 'http://localhost:4566/000000000000/test-queue2',
ReceiptHandle: message.ReceiptHandle,
VisibilityTimeout: visibilityTimeout,
};
sqs.changeMessageVisibility(params, (err, data) => {
if (err) logger.error(err, err.stack);
else logger.info(data);
});
// eslint-disable-next-line no-param-reassign
visibilityTimeout += 300;
}
}, 5000);
};
module.exports = async (message) => {
const startDateTime = moment().valueOf();
const {
noteId,
} = JSON.parse(message.Body);
logger.info(`Processing message [noteId=${noteId}]`);
try {
const note = await TestSessionNote.findById(noteId);
const testSession = await TestSession.findById(note.test_session_id);
logger.info(`Downloading video [key=${testSession.video_key}]`);
const isProcessing = true;
const interval = createInterval(500, startDateTime, message, isProcessing);
await sleep(20000);
clearInterval(interval);
logger.info(`Finished processing message [noteId=${noteId}]`);
} catch (ex) {
await TestSessionNote.update(noteId, { status: 'transcribe_error' });
logger.error(`Error processing message [noteId=${noteId}]`, ex);
}
};
我知道如果我创建一个 var test = setInterval(() => {console.log('blabla')}, 500) 并调用 clearInterval(test) 它会起作用,但我不知道我不知道如何通过调用函数来做到这一点
我认为你必须 return 从 createInterval 函数 intervalId 然后它应该工作。
你能检查一下你当前的 intervalId 值是多少吗?
https://developer.mozilla.org/en-US/docs/Web/API/setInterval
“returned intervalID 是一个数字非零值,用于标识调用 setInterval() 创建的计时器;可以将此值传递给 clearInterval() 以取消间隔。”