在try块中设置Interval,但如果捕捉到异常则清除



我有一个代码在try块中调用setInterval,并在代码末尾清除间隔,但如果我的代码捕获并出现异常,setInterval函数将永远运行。如果我在try块中创建的sqsInterval在catch中不存在,我该如何清除?

const createInterval = (message, queueUrl) => {
let timeout = parseInt(process.env.QUEUE_VISIBILITY_TIMEOUT, 10);
const interval = setInterval(() => {
timeout += parseInt(process.env.VISIBILITY_TIMEOUT_INCREMENT, 10);
if (timeout > 43200) {
return;
}
const params = {
QueueUrl: queueUrl,
ReceiptHandle: message.ReceiptHandle,
VisibilityTimeout: timeout,
};
sqs.changeMessageVisibility(params, (err, data) => {
if (err) logger.error(err, err.stack);
else logger.info(JSON.stringify(data));
});
}, parseInt(process.env.TIMER_INTERVAL, 10));
return interval;
};
try {
// Starting time for complete clip project
const queueUrl = process.env.AWS_SQS_VIDEO_CLIPS_QUEUE_URL;
const sqsInterval = createInterval(message, queueUrl);
await sleep(30000);
clearInterval(sqsInterval);
logger.info(`Finished processing message - [MessageID: ${message.MessageId}], [ReceiptHandle: ${message.ReceiptHandle}] [MD5OfBody]: ${message.MD5OfBody} [noteId=${noteId}]`);
} catch (error) {
clearInterval(sqsInterval);

const sqsInterval的作用域在try{ }内部。用let对外声明

let sqsInterval;
try {
const queueUrl = process.env.AWS_SQS_VIDEO_CLIPS_QUEUE_URL;
sqsInterval = createInterval(message, queueUrl);
await sleep(30000);
clearInterval(sqsInterval);
logger.info(`Finished processing message - [MessageID: ${message.MessageId}], [ReceiptHandle: ${message.ReceiptHandle}] [MD5OfBody]: ${message.MD5OfBody} [noteId=${noteId}]`);
} catch (error) {
clearInterval(sqsInterval);
}

最新更新