Todavía me estoy acostumbrando a la programación funcional (FP). Especialmente FP en React-native. Los objetivos son:
La creación de funciones separadas para cada paso estuvo bien, el problema es cómo 'conectarlas' y obtener el resultado deseado (como se describe en la sección 'El problema'). Cada idea que intenté causó algún tipo de acoplamiento o repetición (de código)
Peticiones
function requestCharacters(start, token) { return axios.get(`https://swapi.dev/api/people/${start}/`,{ headers: { Authorization: 'Bearer ' + token, ContentType: 'application/json', } }) } function requestPlanets(start) { return axios.get(`https://swapi.dev/api/planets/${start}/`); }Porcentaje
const percentage = Math.round((start/finish)*100)Iteración de solicitudes (usando recursividad)
async function loop(start, finish, callback) { if (start >= finish) { console.log("got inside if from loop"); return; } await requestCharacters(1) .then((response) => { const percentage = Math.round(((start)/finish)*100) loop(start + 1, finish, callback({ percentage, pageContent: response.data }); }) .catch((error) => console.error(error)); } loop(1, 3, console.log(percentage, pageContent));Y luego alguna función que devuelve el porcentaje más el objeto obtenido
loop(1, 3, PrintObjectsFromFetch)¿Cómo resolver esto?
¡Gracias si leíste hasta el final!
Esta es la versión no refactorizada. Espero que ayude
import axios from "axios"; function mountAxiosRequest(url) { return axios.get(url); } const arrayOfPages = (total_pages, baseURL) => Array.from({ length: total_pages }, (v, k) => baseURL.replace("iterator", k + 1) ); const total_pages = 16; const baseURL = "https://swapi.dev/api/people/iterator/"; const arrayOfRequests = (total_pages, baseURL, request) => arrayOfPages(total_pages, baseURL).map((url) => request(url)); function PrintPercentageAndData(data) { console.log("from map percentage: ", data); } const mapResponses = (response, total) => response.map((row, index) => { const indexFromOne = index + 1; const percentage = Math.round((indexFromOne / total) * 100); return { percentage, data: row }; }); const promiseArray = (arrayOfRequests) => Promise.all(arrayOfRequests); function GetPercentageAndData(callback, baseURL, request) { const total_pages = 10; const requestsArray = arrayOfRequests(total_pages, baseURL, request); const promissesArray = promiseArray(requestsArray); promissesArray .then((results) => { const result = PrintPercentageAndData( mapResponses(results, results.length) ); if (result !== undefined) callback(result); }) .catch((error) => console.error("error from promissesArray : ", error)); } GetPercentageAndData( PrintPercentageAndData, "https://swapi.dev/api/species/iterator/", mountAxiosRequest );