Estoy tratando de acceder a la API de NHL para un proyecto personal. Estaba recibiendo errores de solicitud de CORS y encontré la siguiente solución para acceder a todos los diferentes sitios (algunos funcionaron antes y otros no).
Estoy pasando a través de un enlace y, según uno de los resultados , parece estar accediendo a los datos en la página y mostrándolos en formato JSON y de cadena. El único problema es que no puedo devolver ninguno de esos datos fuera de la función como un objeto o de otra manera.
Los últimos 2 registros muestran indefinidos, y los 2 dentro de la función generan los datos que quiero. ¿Me estoy perdiendo algo obvio o hay un problema más profundo con el acceso al sitio web?
Gracias.
function getJSON(url){ let request = new XMLHttpRequest(); request.open('GET', url); request.onload = function () { // Begin accessing JSON data here let data = JSON.parse(this.response); if (request.status >= 200 && request.status < 400) { //Start writing function here console.log(data); console.log(JSON.stringify(data)); let data2 = JSON.stringify(data) return data2 } else { console.log('error'); } } request.send(); } let data1 = getJSON("https://statsapi.web.nhl.com/api/v1/people/8476459/stats?stats=statsSingleSeason&season=20212022") console.log(data1); console.log(JSON.stringify(data1));Está realizando una llamada asíncrona, lo que significa que devuelve el valor antes de que la respuesta regrese, es por eso que data1 no está undefined
Puedes ver este post para más información.
Para su caso, puede envolver la solicitud con Promise
async function getJSON(url) { return new Promise(function (resolve, reject) { let request = new XMLHttpRequest(); request.open('GET', url); request.onload = function () { // Begin accessing JSON data here let data = JSON.parse(this.response); if (request.status >= 200 && request.status < 400) { //Start writing function here let data2 = JSON.stringify(data) return resolve(data); } else { return reject('error') } } request.send(); } ) } async function main() { let data1 = await getJSON("https://statsapi.web.nhl.com/api/v1/people/8476459/stats?stats=statsSingleSeason&season=20212022") console.log(data1); console.log(JSON.stringify(data1)); } main();Una mejor manera es usar Fetch API
async function getJSON(url) { const data1 = await fetch(url). then(response => response.json()); return data1; } async function main() { const result = await getJSON('https://statsapi.web.nhl.com/api/v1/people/8476459/stats?stats=statsSingleSeason&season=20212022'); console.log(result); } main();