Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

174
Vistas
¿Cuál podría ser una mejor opción para llamar a un método recursivo o mejor una función JS que tiene que volver a intentar una solicitud si un valor es nulo?

Creé una función en mi backend de NodeJS que tiene el propósito de volver a intentar 10 veces una solicitud si un valor en la primera solicitud es igual a nulo. Este comportamiento es necesario porque hay una función de trabajador que sube PDF a AWS, por lo que el valor que estoy recuperando con la nueva función contiene una URL de PDF que muy a menudo en la primera solicitud es nula.

El objetivo es verificar primero si tenemos el pdfUrl si eso no es NULL para devolver los datos.

Si pdfURL por algún motivo es NULL, entonces la función debe volver a intentar la solicitud con un tiempo de espera de 20 s y un máximo de 10 reintentos.

La función que probé es la siguiente y tiene varios problemas:

  1. Parece que se está reintentando 10 veces si pdfUrl no es nulo en lugar de reintentar solo si es nulo y solo para reintentos máximos
  2. La función después de las 10 veces debería devolver una excepción de error y no nula
  3. La función debería darse por vencida y dar el error solo si falla 10 veces
 async function getIcfDocument(documentId, { log }) { log.info('Getting IcfDocument with last revision pdfUrl'); const MAX_RETRIES = 10; const timeout = 20000; let data; for (let i = 0; i <= MAX_RETRIES; i += 1) { try { const { icfDocuments } = await request( CONSENT_SERVICE_URL, getICFDocumentRecipientsQuery, { documentId, } ); if (icfDocuments.nodes[0].revision.pdfUrl) { log.info('Success the revision pdfUrl is present'); data = icfDocuments; } else { log.debug( 'Waiting to retrieve the last revision pdfUrl %s ms', timeout ); await sleep(timeout); log.debug('Retrying times %s', i); } } catch (err) { log.error( 'Failed to retrieve the data for document %s, Error: %s', documentId, err.message ); return null; } } return data; }

Será bueno ver una mejor manera de lo que he intentado, ya que tengo algunas dificultades para hacerlo.

El método de solicitud anterior solicita a una consulta GQL por qué se implementó de esta manera

 const { icfDocuments } = await request( CONSENT_SERVICE_URL, getICFDocumentRecipientsQuery, { documentId, } );

El icfDocuments es el OBJ resultante de la consulta que contiene el urlPdf y otra información. Esta consulta debe volver a intentarse si esa URL es nula durante un máximo de 10 veces y 20 s de tiempo de espera entre solicitudes.

La consulta es esta como info

 const getICFDocumentRecipientsQuery = gql` query GetICFDocumentRecipients($documentId: ID!) { icfDocuments(filter: { ids: [$documentId] }, pagination: { limit: 1 }) { nodes { id recipients { id email phone locale } revision { pdfUrl } } } } `;
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

  • Regrese de inmediato cuando se encuentren los datos sin continuar el ciclo.
  • Si no se encuentra la URL del pdf, muestre el error de registro en lugar del mensaje de reintento.
 async function getIcfDocument(documentId, { log }) { log.info('Getting IcfDocument with last revision pdfUrl'); const MAX_RETRIES = 10; const timeout = 20000; for (let i = 0; i <= MAX_RETRIES; i++) { try { const { icfDocuments } = await request( CONSENT_SERVICE_URL, getICFDocumentRecipientsQuery, { documentId, } ); if (icfDocuments.nodes[0].revision.pdfUrl) { log.info('Success the revision pdfUrl is present'); return data; // SOLUTION TO #1 } else { if (i == MAX_RETRIES) return log.error('Failed to retrieve pdfUrl after %s tries.', MAX_RETRIES); // SOLUTION TO #2 log.debug( 'Waiting to retrieve the last revision pdfUrl %s ms', timeout ); await sleep(timeout); log.debug('Retrying times %s', i); } } catch (err) { log.error( 'Failed to retrieve the data for document %s, Error: %s', documentId, err.message ); break; } } return null; }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda