es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puedes crear una variable para almacenar el ID del intervalo devuelto por la función setInterval() y pasarla a la función clearInterval() cuando desees detener el intervalo. En el código proporcionado, puedes modificar la función createInterval para que devuelva el ID del intervalo y almacenarlo en una variable.

    Aquí tienes un ejemplo:

    const createInterval = (visibilityTimeout, startDateTime, message) => {
      return setInterval(() => {
        // código del intervalo aquí
      }, 5000);
    };
    
    // En la función de exportación del módulo
    const intervalId = createInterval(500, startDateTime, message, isProcessing);
    await sleep(20000);
    clearInterval(intervalId);
    

    Al hacer esto, el ID del intervalo se guarda en la variable intervalId, que se puede usar más adelante para detener el intervalo utilizando clearInterval(intervalId).

Comments are closed.