Tengo un problema en el que llamo a una función que se supone que devolverá una lista, al mismo tiempo que asigno el valor de retorno de esa función a una variable, que no está definida. Sospecho que esto tiene que ver con el hecho de que estoy obteniendo datos de la base de datos en tiempo real (firebase), usando get, y tales funciones siempre se ejecutan después del hecho, lo que significa que mi función devuelve un valor antes de que se cree el valor en get función. No sé exactamente cómo solucionarlo, pero he tenido problemas similares en Swift, de ahí la sospecha de que la causa es la jerarquía de compilación.
Esta es la función:
export default function createRoutes() { const db = getDatabase(app); const dbRef = ref(db); get(child(dbRef, `parties`)) .then((snapshot) => { const data = snapshot.val(); var paths = Object.keys(data); let completeArray = []; for (const path of paths) { completeArray.push({ type: "collapse", name: path, key: path, route: "/" + path, component: <SvgBeta />, }); } return completeArray; }) .catch((error) => { console.error(error); }); }En mi archivo index.js, llamo a esta función y asigno el valor devuelto a una variable.
var hello = createRoutes(); console.log(hello);Esto registra 'indefinido' Si tuviera que registrar el valor devuelto (completeArray) dentro de la función, se registraría correctamente, lo he intentado.
¿Cómo resuelvo este problema, de modo que la variable hola sea igual al valor de completeArray, ya que mira hacia el final de la ejecución de la función?
createRoutes no tiene declaración de devolución, por lo que implícitamente devuelve indefinido. Hay una declaración de devolución dentro de la devolución de llamada .then , pero todo lo que hace es controlar en qué se resuelve la promesa. Deberá devolver la promesa para que esté disponible para el mundo exterior:
export default function createRoutes() { const db = getDatabase(app); const dbRef = ref(db); // Added "return" to the next line return get(child(dbRef, `parties`)) .then((snapshot) => { // ..etc } // used like: createRoutes().then(hello => { console.log(hello); });Tenga en cuenta que devolverá una promesa que se resuelve en la matriz, no en la matriz en sí. No es posible devolver una matriz, porque esa matriz aún no existe (primero debe obtenerse de la base de datos).