Buenos días a todos,
Tengo problemas para entender algunas actividades asincrónicas.
Lo que busco hacer es tomar algunos datos, pasar el valor devuelto a una variable, mostrar esa información (y hacer algunas otras funciones según lo que salga). Este proceso debe poder expandirse a múltiples conjuntos de datos, como pronósticos por hora, pronósticos semanales, información sobre peligro de incendio, etc., y se ejecutará en intervalos.
Revisé la página Promise de MDN junto con numerosas búsquedas aquí para obtener una respuesta, pero no parece hacer clic.
Lo que tengo hasta ahora:
let weeklyData; let pull; async function pullData(url){ fetch(url).then(res=>res.json()).then((val)=>{pull=val}); } function buildDataSets(){ for(let x = 0; x < pull.properties.periods.length; x++){ weeklyDataSets[x] = pull.properties.periods[x]; } }Cuando se llaman a mano en la consola, estos se resuelven correctamente. Pull sale como un objeto y buildDataSets() puede ejecutarse. Imagino que es porque hay tiempo suficiente para que se resuelva pullData(url) .
Necesito procesar la respuesta de pullData(url) , por lo que debo asignar su valor de retorno a un objeto.
Lo que puedo decir, debería estar usando algo en el estadio de béisbol de
Promise.resolve(pullData(url)) .then(()=> buildDataSets());Esto devuelve un estado pendiente y la extracción permanece sin definir cuando buildDataSets() se desactiva. Sé que necesito extraer los datos, esperar hasta que se completen, luego asignar el valor a extracción si es exitoso. Luego, después de que se haya asignado la extracción, llame a la función buildDataSets() . Agregar un .then() que llama a buildDataSets() tampoco parece funcionar, lo que hace que la extracción no esté definida cuando intenta acceder a los valores.
¿Podría alguien ayudarme a explicar lo que me estoy perdiendo? Siento que estoy mirando la respuesta, pero no puedo verla.
Debería devolver un valor de pullData para que otros puedan await (o acceder a él en el controlador then ). Consulte ¿Por qué mi variable permanece inalterada después de modificarla dentro de una función? - Referencia de código asíncrono
Por lo general, no establece una variable no local de una devolución de llamada asincrónica exactamente por lo que ha mencionado. La
Probablemente desee que buildDataSets también devuelva una Promesa.
async function pullData(url){ return fetch(url).then(res=>res.json())); } async function buildDataSets(){ const pull = await pullData('/url'); const weeklyDataSets = {}; for(let x = 0; x < pull.properties.periods.length; x++){ weeklyDataSets[x] = pull.properties.periods[x]; } return weeklyDataSets; } async function myMain () { const data = await buildDataSets(); console.log({data}); } Aquí está el mismo código sin usar await s, solo cadenas Promise
function pullData(url){ return fetch(url).then(res=>res.json())); } function buildDataSets(){ return pullData('/url') .then((pull) => { const weeklyDataSets = {}; for(let x = 0; x < pull.properties.periods.length; x++){ weeklyDataSets[x] = pull.properties.periods[x]; } return weeklyDataSets; }); } function myMain() { return buildDataSets().then((sets) => { console.log({sets}); }); }