este es mi codigo
async function checksubsdetails() { try { let update_data = []; db_office.query( `SELECT arn_no,arn_id,cams_email from no_of_arn WHERE cams_email !=''`, async (err, arn_rows) => { if (err) throw err; for (let inx of arn_rows) { // console.log(inx.arn_no) await db_office.query( `SELECT arn_no from cams_subs WHERE arn_no='${inx.arn_no}'`, async (err, subs_rows) => { if (err) throw err; // console.log(subs_rows) if (subs_rows.length == 0) { await db_office.query( `INSERT INTO cams_subs(arn_id, arn_no) values('${inx.arn_id}', '${inx.arn_no}')`, (err, my_cursor) => { if (err) throw err; console.log(("New Data Added for Arn no -> ", inx.arn_no)); update_data.push(inx); } ); } else { console.log("Data Already Exists for arn no ->", inx.arn_no); //console.log(("New Data Added for.lo")) update_data.push(inx); } } ); } return [2, update_data]; } ); } catch (err) { console.log(err); return [1, "Exception While adding Data to Cams Subs"]; } }Devuelvo [2, update_data] pero no estoy definido para update_data.
No puedo averiguar qué hacer para resolver esto porque los procesos posteriores solo pueden ocurrir después de obtener este valor.
update_data está dando resultado en la declaración if-else que he escrito, pero quiero que devuelva la matriz update_data después del ciclo for.
Por favor, ayúdame en esto.
Gracias
@jfriend00 explicó el problema: aquí hay una posible solución que usa la función util.promisify de Node.js para tomar la función db_office.query y convertirla en algo que realmente se puede await .
Por favor, preste atención a los comentarios en el código.
async function checksubsdetails() { // Promisify the `db_office.query` function (depending on the library, // it may already have a promisified counterpart; please read the docs). const queryP = util.promisify(db_office.query.bind(db_office)); const update_data = []; const arn_rows = await queryP( `SELECT arn_no, arn_id from no_of_arn WHERE cams_email !=''`, ); for (let inx of arn_rows) { // TODO: this is susceptible to race condition attacks since multiple processes // may be doing this loop simultaneously const subs_rows = await queryP( `SELECT arn_no from cams_subs WHERE arn_no = '${inx.arn_no}'`, // TODO: fix SQL injection vulnerability ); if (subs_rows.length === 0) { await queryP( `INSERT INTO cams_subs(arn_id, arn_no) values ('${inx.arn_id}', '${inx.arn_no}')`, // TODO: fix SQL injection vulnerability ); console.log("New Data Added for Arn no -> ", inx.arn_no); } else { console.log("Data Already Exists for arn no ->", inx.arn_no); } update_data.push(inx); } return update_data; }Dentro de la línea de función n.° 4, está llamando a db_office.query() sin esperar . Así que esta promesa no se cumplió. Entonces, justo después de ejecutar la función, esa promesa se agrega en el ciclo de eventos asincrónicos y se devuelve. No estás esperando a que se cumpla la promesa. Cuando esa promesa se cumple después de la devolución, está viendo la salida en la consola. Pruebe con await y devuelva su devolución después de que se cumpla la promesa
await db_office.query() // return after every promise is fulfilled