Estoy tratando de entender para imbricar bucles en javascript y llamar a una función asíncrona importada desde un script asíncrono y aparece un error. Parece que ReadinglogManager.getReadingLogForAPeriod no se puede llamar con await?
Código principal:
var myfunction = async function(req, res, next){ students.forEach(function(s) { dateobj.forEach(function(d) { console.log('Date: '+d.toString()) let st= new Date(); const rl = await ReadinglogManager.getReadingLogForAPeriod(st,s.uid ); }); }); }De ReadinglogManager:
var getReadingLogForAPeriod = async function(start_date, student_uid){ let db = DatabaseManager.fs.firestore(); let dataset = []; let snapshot = await db.collection('ReadingLog').where('date', '>=', start_date).where('student_uid', '=', student_uid).get(); // dataset = await DatabaseManager.snapshot_to_resultset(snapshot); await snapshot.forEach(doc => { let tdoc=doc.data(); tdoc.uid=doc.id; console.log("DOC: "+JSON.stringify(tdoc)); dataset.push(tdoc); }); return Promise.resolve(dataset); }Gracias
Como await solo se puede usar dentro de una función async y la función de devolución de llamada (la parte function(d) {} ) no es asíncrona, por lo que dicho uso dará como resultado un error.
Además, cambiarlo a async function(d) {} tampoco resuelve el problema. Porque forEach no espera que su devolución de llamada sea una función asíncrona y no await su ejecución asíncrona.
Entonces, para tales casos, debe usar un bucle simple en lugar de forEach , como:
var myfunction = async function(req, res, next){ for(let n = 0;i<students.length;++i){ let s = students[n]; for(let i = 0;i<dateobj.length;++i){ let d = dateobj[i]; console.log('Date: '+d.toString()) let st= new Date(); const rl = await ReadinglogManager.getReadingLogForAPeriod(st,s.uid ); } } }