fetchUserObjects
всегда возвращает пустой массив. Ничто не гарантирует, что асинхронная работа, начатая once()
, выполняется до того, как вы поместите значения в массив. Также обратите внимание, что вы на самом деле не помещаете обещания в этот массив. Вы выдвигаете простые старые объекты JavaScript. Вместо этого вам нужно вставить в массив фактические обещания, и вам нужно делать это, не дожидаясь разрешения других обещаний. Вот как это должно выглядеть вместо этого:
const fetchUserObjects = function(uids){
let promises = []
uids.forEach((uid) => {
const promise = admin.database().ref(`/users/${uid}`).once("value")
.then(function(dataSnapshot) {
const userDataAll = dataSnapshot.val()
const userData = {}
userData.id = userDataAll.id
userData.username = userDataAll.username
userData.first = userDataAll.first
userData.last = userDataAll.last
console.log(userData)
return userData
})
.catch((error) => {
// Re-throwing the error as an HttpsError so that the client gets the error details.
throw new functions.https.HttpsError('unknown', error.message, error);
});
promises.push(promise)
})
return Promise.all(promises);
}
Обратите внимание, что обещание немедленно помещается в массив обещаний, и оно разрешается с помощью объекта userData
, который был возвращен обратным вызовом then
.