Tratando de escribir esto de una manera que esperará a que se completen las operaciones de db. ¿Posible?
function addFriendsToSession(session, sessionId) { const friends = []; const incoming = session.users.forEach(async user => { console.log('user', user); await db .collection('users/' + user + '/settings') .doc(user) .get() .then(doc => { if (doc.exists) { const returnObj = doc.data(); return returnObj.friends ? returnObj.friends : []; } else { return []; } }); }); friends.push(incoming); return friends; }Utilice Promise.all .
Promise.all acepta una serie de promesas y se resuelve una vez que se ha resuelto cada promesa. Puede mapear su operación usando map . P.ej,
const promises = session.users.map(user => { console.log('user', user); return db .collection('users/' + user + '/settings') .doc(user) .get() .then(doc => { if (doc.exists) { const returnObj = doc.data(); return returnObj.friends ? returnObj.friends : []; } else { return []; } }); }); const friends = await Promise.all(promises) return friends;Hay una serie de cuestiones aquí.
db.then() , se usa return , pero este valor nunca se devuelve desde la función que lo encierra (que es async user => {...} )const incoming se le asigna el resultado de session.users.forEach , pero Array.forEach() nunca tiene un valor de retorno (¿puede estar pensando en Array.map() ?)incoming aún sería una serie de PromesasSugerencias adicionales:
Poniendolo todo junto:
const incoming = session.users.map(async user => { console.log('user', user); const doc = await db .collection('users/' + user + '/settings') .doc(user) .get(); //we assigned `doc` using await instead of using .then if (doc.exists) { const returnObj = doc.data(); return returnObj.friends ? returnObj.friends : []; } else { return []; } }); //incoming is not an array of Promises const incomingFriends = await Promise.all(incoming); //takes an array of Promises and returns an array of the resolved values //incomingFriends is now an array of friends //next line would make the last element an array //friends.push(incoming); //you probably want to push every element of the array friends.push(...incomingFriends);