Estoy jugando con setTimeout y no obtengo los resultados que esperaba. Tengo una matriz con el nombre de autos, y tengo una función llamada fetchCars que simplemente llama a setTimeout y devuelve los autos después de 1000 ms. Por lo que sé, setTimeout debería tener acceso a la matriz de autos debido a los cierres, pero por alguna razón, cuando espero una invocación de fetchCars, no obtengo ningún resultado.
Aquí hay una caja de arena Aquí está mi código:
const cars = [ { brand: "Toyota", model: "Camry", year: "2014" }, { brand: "BMW", year: "2016", model: "M3" }, { brand: "Porche", model: "911", year: "2018" } ]; export const fetchCars = async () => { setTimeout(() => { return cars; }, 1000); }; const recieveCars = async () => { const cars = await fetchCars(); console.log(cars); }; recieveCars(); ///Console Output: undefinedLa razón por la que está viendo undefined en su consola es que fetchCars devuelve una Promesa (solo en virtud de que la ha etiquetado con async ) que se resuelve como indefinido; en otras palabras, ¡realmente no devuelve nada!
export const fetchCars = async () => { setTimeout(() => { // the callback you have passed to setTimeout will return cars, not the fetchCars function return cars; }, 1000); }; Si desea que fetchCars devuelva un valor, debe devolver una Promesa que se resolverá en el valor que desea devolver.
// no need for async here, because we're going to be returning a Promise explicilty export const fetchCars = () => { return new Promise((resolve) => { setTimeout(() => { resolve(cars); }, 1000); }); };setTimeout usa una devolución de llamada y no tiene una versión nativa de Promise . Si bien la respuesta de Brendan es correcta y perfectamente funcional, otra opción que es más consistente con el estilo async/await es await la promesa de tiempo de espera en la función async y luego devolver el valor.
export const fetchCars = async () => { await new Promise((r) => setTimeout(r, 1000); return cars; };Si está haciendo esto mucho, una función de conveniencia como esta:
const delay = (delayTime) => new Promise((r) => setTimeout(r, delayTime));Entonces te permitirá escribir tu función como:
export const fetchCars = async () => { await delay(1000); return cars; };