Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

177
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda