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

202
Vistas
¿Cómo puedo ejecutar una función con promesas y verificar su valor varias veces mediante una llamada API y ejecutar otra función con el valor?

Estoy trabajando en una aplicación donde necesito hacer una llamada a la API que está en una función y luego usar su valor para hacer otra llamada a la API. Pero el valor de la primera llamada a la API no está disponible ya que depende de algunos factores externos. Entonces, después de hacer la primera llamada a la API, necesito hacer 3 llamadas a la API en intervalos de 5 segundos para verificar si el valor está disponible o no. Si es así, realice la segunda llamada a la API; de lo contrario, no realice la segunda llamada a la API.

Ahora sé que tengo que hacer Promesas y traté de hacerlo, pero no estoy seguro de si lo que estoy haciendo es correcto.

Esto es lo que podría hacer con la función Promise:

 const promiseFunc = ( param1, param2 ) => { return new Promise(( resolve, reject ) => { const func1 = api1( param1 ); if ( func1.code === '200' ) { const startInterval = setInterval( () => { const check = getValue(); if ( check && check === param2 ) { clearInterval( startInterval ); resolve(); } else { reject(); } }, 5000); } else { reject(); } }); }

Entonces, lo que está sucediendo en la función anterior es que se necesitan dos parámetros para llamar a las llamadas a la API. func1 se ejecuta y, si devuelve 200, inicia el temporizador de intervalos. Tenga en cuenta que la llamada a la función api1 es la llamada a la API. Intenté usar await allí pero arroja un error. Y no estoy seguro de poder usar async/await dentro de una función Promise.

Continuando, la variable de check comienza a hacer llamadas a la API ( getValue() también es una función que incluye los puntos finales de la API) para verificar el valor si está disponible o no. si es así, resuelva, si no, entonces rechace.

Así es como estoy ejecutando la función promiseFunc en secuencia:

 promiseFunc( myChosenValue1, myChosenValue2 ) .then( data => { return promiseFunc( valueFromFirstExecution1, valueFromFirstExecution2 ) }) .then( () => { console.log( 'Successfully executed both the functions' ); }) .catch( e => { console.log( e ); });

Esto es lo más lejos que podría llegar al escribir una función Promise y sé que hay varios problemas en el código anterior. La primera función se ejecuta correctamente, pero luego aparece este error TypeError: Cannot read property 'code' of undefined . Además, no estoy seguro de si se ejecutarían las llamadas a la API en setInterval. ¿Alguna idea?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Así que tienes un par de cosas sucediendo aquí:

  1. Desea sondear un proceso del lado del servidor para que se complete
  2. Desea llamar a otra función con el resultado de la finalización exitosa del proceso del lado del servidor.

Así que escribamos algunos ayudantes:

 // We need a way to wait for some amount of time before // retrying a request, sleep sleeps for n milliseconds const sleep = (n) => new Promise(res => setTimeout(res, n)); // We need a unique sentinel value so we know when we have actual // results from an API call instead of this default value const sentinel = {}; // or Symbol, whatever unique you prefer // poll will take the data necessary to make a fetch // request and repeat it every `interval` milliseconds // up to `maxRetries` until it gets a result const poll = async (url, fetchOpts, interval, maxRetries) => { let result = sentinel; // default value let ticker = 0; // current number of retries while (result === sentinel && ticker < maxRetries) { // make the api call const resp = await fetch(url, fetchOpts); const data = await resp.json(); // do we have a result? if (isDone(data)) { // whatever criteria == completion result = data; // breaks the loop } else { // wait `interval` milliseconds and try again. ticker++; await sleep(interval); } } // Oops! We didn't get an answer back from the // api in time if (result === sentinel) { throw new Error('Exceeded maxRetries!'); } return result; };

Así que ahora podemos hacer lo que queremos:

 // call this with the eventual result, *if* we // get one const onSuccess = (result) => {...}; // whatever // This is doing the actual work const doTheThing = async () => { await fetch(firstApiCall); // kick off the process try { // wait for completion const data = await poll(url, {}, 5000, 6); // ~30sec timeout // pass successful result onwards return onSuccess(data); } catch (err) { // Error bubbling is a little weird with async // functions, so we'll just handle it here and // return undefined console.error(err) return } };
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