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.

Establecer el intervalo dentro del bloque try pero borrarlo si ocurre una excepción en el bloque catch.

Tengo un código que llama a un setInterval en el bloque try y limpio el intervalo al final del código, pero si mi código captura una excepción, la función setInterval sigue ejecutándose indefinidamente. ¿Cómo puedo limpiar esto si el sqsInterval que creé en el bloque try no existe en el 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);
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para limpiar la función setInterval en el bloque catch, es necesario declarar la variable sqsInterval fuera del bloque try y luego asignarle el intervalo creado dentro del bloque try. De esta manera, si se produce una excepción en el bloque try y el intervalo nunca se crea, sqsInterval será undefined y tratar de eliminarlo en el bloque catch no lanzará un error.

    Aquí tienes un ejemplo:

    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;
    };
    
    let sqsInterval; // declara la variable fuera del bloque try
    
    try {
      const queueUrl = process.env.AWS_SQS_VIDEO_CLIPS_QUEUE_URL;
      sqsInterval = createInterval(message, queueUrl); // asigna el intervalo creado a la variable
      await sleep(30000);
      clearInterval(sqsInterval);
      logger.info(`Finalizando el procesamiento del mensaje - [MessageID: ${message.MessageId}], [ReceiptHandle: ${message.ReceiptHandle}] [MD5OfBody]: ${message.MD5OfBody} [noteId=${noteId}]`);
    } catch (error) {
      clearInterval(sqsInterval); // limpia el intervalo incluso si no se creó
    }
    

Comments are closed.