Tengo una matriz de objetos en un estado de reacción actual, quiero iterar a través de cada objeto en la matriz y tomar una idea para hacer una solicitud para cada objeto y obtener información de la API para completar los datos faltantes en el objeto.
Cuando ejecuto el comando, aparece un error 429 que significa que se envían muchas solicitudes antes de que tengan tiempo de procesarlas. Intenté usar un temporizador pero no funcionó. También traté de usar useEffect pero me encontré con el mismo problema. Recurrí a volver a la idea original, que era un bucle for, pero está rompiendo todo.
código:
function buildCompleteProperties(){ for(let i = 0; i < propertyList.length; i++){ propertyOptions['params'] = {zpid: propertyList[i]['zpid']} axios.request(propertyOptions).then(function (response) { console.log(response.data); }).catch(function (error) { console.error(error); }); } }Al final, muestra los primeros detalles de la propiedad de las solicitudes. así es como se ve la consola:
VM7363:1 GET https://zillow-com1.p.rapidapi.com/property?zpid=20471276 429 (Too Many Requests) Error: Request failed with status code 429 at createError (createError.js:16) at settle (settle.js:17) at XMLHttpRequest.onloadend (xhr.js:66) VM7363:1 GET https://zillow-com1.p.rapidapi.com/property?zpid=20471276 429 (Too Many Requests) Error: Request failed with status code 429 at createError (createError.js:16) at settle (settle.js:17) at XMLHttpRequest.onloadend (xhr.js:66) VM7363:1 GET https://zillow-com1.p.rapidapi.com/property?zpid=20471276 429 (Too Many Requests) Error: Request failed with status code 429 at createError (createError.js:16) at settle (settle.js:17) at XMLHttpRequest.onloadend (xhr.js:66) VM7363:1 GET https://zillow-com1.p.rapidapi.com/property?zpid=20471276 429 (Too Many Requests) Error: Request failed with status code 429 at createError (createError.js:16) at settle (settle.js:17) at XMLHttpRequest.onloadend (xhr.js:66) listingProvider: {…}, buildingPermits: null, propertyTaxRate: 0.77, contact_recipients: Array(1), solarPotential: {…}, …} address:El enfoque más sencillo sería hacer una breve pausa después de cada llamada. Puede lograr esto haciendo que su función sea asíncrona y asignando axios.request() a una variable usando await (en lugar de usar la sintaxis .then() después). Establezca el temporizador de suspensión en el valor que sea necesario para mantenerse dentro de las limitaciones de la API.
Así es como lo refactorizaría:
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function buildCompleteProperties(){ for(let property of propertyList){ propertyOptions.params = { zpid: property.zpid } try { let { data } = await axios.request(propertyOptions); console.log(data) await sleep(1000) } catch (error){ console.error(error); } } }Cuando termine la llamada, dispare la siguiente.
function makeRequests() { let i = 0; function next() { propertyOptions['params'] = { zpid: propertyList[i]['zpid'] }; axios.request(propertyOptions).then(function (response) { console.log(response.data); i++; if (propertyList.length < i) next(); }); } next(); }