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?
Así que tienes un par de cosas sucediendo aquí:
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 } };