Tengo una pregunta, entiendo un poco cómo funcionan las promesas, pero me gustaría esperar a que finalice una función, incluso si no devuelve nada. Tengo un código similar pero no espera a que b termine antes de comenzar los pasos adicionales en a.
Por ejemplo, en este caso, quiero crear tablas en una base de datos sqlite, luego cargar datos y ejecutar algunas pruebas. Lo que pasa aquí es que está comenzando a ejecutar las pruebas antes de terminar de cargar los datos y las matrices creadas en el método loadData están vacías. Incluso preferiría no devolver esas matrices, sino esperar siempre a que se complete este proceso antes de ejecutar las pruebas.
async function initialize(){ try{ console.log("Beginning connection"); db = await connectToDB(); console.log(`Database: ${db}`) db.serialize(function() { console.log("Creating tables") db.run(queries.__parent_company); db.run(queries.parent_company); db.run(queries.__sales_rep); db.run(queries.sales_rep); db.run(queries.advertiser); console.log("Tables created"); }); let response = await loadData(); console.log("Response", response) testData(); } catch(e){ throw e; } } function loadData() { return new Promise(async (resolve, reject) => { console.log("Beggning data insertion"); try{ let insertedAdvertisers = []; let insertedSales = []; let insertedCOmpanies = []; data.rows.forEach(async row => { let advertiser = await loadAdvertisers(row); let sale = await loadSalesRep(row); let company = await loadParentCompany(row); insertedAdvertisers.push(advertiser); insertedSales.push(sale); insertedCOmpanies.push(company); console.log("HERE", insertedAdvertisers, insertedSales, insertedCOmpanies) }) resolve({insertedAdvertisers, insertedSales, insertedCOmpanies}); } catch(e){ console.log(e); reject(e); } }); }En cuanto a Promises, le aconsejo que lea sobre el bucle de eventos y cómo funciona.
Lo que sucede en su código es que JS sabe que se trata de una promesa, por lo que lo moverá a la cola de devolución de llamada hasta que finalice y continúe ejecutando su código y luego lo empuje a la pila para que se ejecute. por lo tanto, si desea ejecutar una determinada lógica después de que finalice una función asíncrona, debe proporcionarla como una devolución de llamada o usar .then()
async function a() { b().then(()=>{ // your code that you want to be executed after a finishes }) }Esta imagen podría ilustrar lo que estoy tratando de explicar.