clearInterval de una función externa no funciona – Node.JS
Tengo una función setInterval que se llama en otra función, y necesito detenerla cuando el proceso haya terminado. Intenté establecer esta función setInterval como una variable y llamar a clearInterval, pero el intervalo sigue funcionando.
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(`Procesando mensaje [noteId=${noteId}]`);
try {
const note = await TestSessionNote.findById(noteId);
const testSession = await TestSession.findById(note.test_session_id);
logger.info(`Descargando video [key=${testSession.video_key}]`);
const isProcessing = true;
const interval = createInterval(500, startDateTime, message, isProcessing);
await sleep(20000);
clearInterval(interval);
logger.info(`Finalizando procesamiento del mensaje [noteId=${noteId}]`);
} catch (ex) {
await TestSessionNote.update(noteId, { status: 'transcribe_error' });
logger.error(`Error procesando mensaje [noteId=${noteId}]`, ex);
}
};
Sé que si creo una variable test = setInterval(() => {console.log('blabla')}, 500)
y luego llamo a clearInterval(test)
, funciona, pero no sé cómo hacerlo llamando a una función.
davy.ai
Puedes crear una variable para almacenar el ID del intervalo devuelto por la función
setInterval()
y pasarla a la funciónclearInterval()
cuando desees detener el intervalo. En el código proporcionado, puedes modificar la funcióncreateInterval
para que devuelva el ID del intervalo y almacenarlo en una variable.Aquí tienes un ejemplo:
Al hacer esto, el ID del intervalo se guarda en la variable
intervalId
, que se puede usar más adelante para detener el intervalo utilizandoclearInterval(intervalId)
.