Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

173
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!