Quiero hacer una inserción de SQL y luego una selección con la lista completa para mostrar en Vue, incluida la nueva entrada. Pero Seleccionar es más rápido que Insertar y solo devuelve los valores antiguos que ya están en la Tabla. Probé con setTimeout y Async-Await. (Las declaraciones SQL están funcionando)
¿Puede alguien ayudarme? Soy nuevo en JS.
async function select_time(datum, mitarbeiter_id){ let returnQuery = 'SELECT ...' let retquery = mysql.format(returnQuery,[datum, mitarbeiter_id]); pool.query(retquery,(err, data) => { if(err) { console.error(err); return err } return data }); } async function insert_time(datum, mitarbeiter_id, projekt_id, zeit_von, zeit_bis, stunden, taetigkeit){ let selectQuery = 'INSERT INTO ...'; let query = mysql.format(selectQuery,[taetigkeit, projekt_id, mitarbeiter_id, zeit_von, zeit_bis, stunden, datum]); pool.query(query,(err) => { if(err) { console.error(err); } }); if(taetigkeit == 15){ let updateQuery = "UPDATE ..." let query2 = mysql.format(updateQuery, [mitarbeiter_id]) pool.query(query2,(err, data) => { if(err) { console.error(err); } }); } } async function run_insert_time(datum, mitarbeiter_id, projekt_id, zeit_von, zeit_bis, stunden, taetigkeit){ await insert_time(datum, mitarbeiter_id, projekt_id, zeit_von, zeit_bis, stunden, taetigkeit) const jsret = await select_time(datum, mitarbeiter_id) return jsret } app.get('/insertTime', (req, res) => { const datum = req.query.datum; const mitarbeiter_id = req.query.mitarbeiter_id; let projekt_id = req.query.projekt_id; let zeit_von = req.query.zeit_von; let zeit_bis = req.query.zeit_bis; const stunden = req.query.stunden; const taetigkeit = req.query.taetigkeit; const js = run_insert_time(datum, mitarbeiter_id, projekt_id, zeit_von, zeit_bis, stunden, taetigkeit) res.json(js) })Si pool.query no tiene una función similar con el soporte de Promise, entonces debe envolver todas esas llamadas en promesas para poder esperar los resultados y devolverlos si lo desea.
async function select_time(datum, mitarbeiter_id){ let returnQuery = 'SELECT ...' let retquery = mysql.format(returnQuery,[datum, mitarbeiter_id]); return new Promise((resolve, reject) => { pool.query(retquery,(err, data) => { if(err) { console.error(err); reject(err); } resolve(data); }); }); }Mire esta respuesta para obtener más información sobre cómo convertir funciones con devoluciones de llamada en funciones similares a promesas.
Para ampliar la muy buena respuesta de @anatoly:
Considero que la return new Promise... es visualmente perjudicial para el flujo del programa. Al crear una versión "prometida" separada, su función asíncrona se vuelve mucho más limpia. Es solo reorganizar el código, con el mismo resultado final.
const pQuery = qryText => new Promise((resolve, reject) => { pool.query(qryText, (err, data) => { if (err) reject(err); else resolve(data); }); }); Entonces sus async function vuelven bastante limpias. Por ejemplo:
async function select_time(datum, mitarbeiter_id){ let returnQuery = 'SELECT ...' let retquery = mysql.format(returnQuery,[datum, mitarbeiter_id]); const data = await pQuery(retquery); return data; }Aparte: node.js tiene util.promisify , lo que hace que esto sea aún más fácil de implementar.
const { promisify } = require('util'); const pQuery = promisify(pool.query.bind(pool)); (Estoy bastante seguro de que necesita el bind , pero puede probar sin él y ver si funciona)