Я создал обещание, которое будет принимать массив ключей firebase в качестве входных данных, зацикливать их для запроса базы данных firebase в реальном времени. Моя проблема заключается в том, что даже после того, как я использую асинхронное ожидание, чтобы firebase предоставила результаты, обещание быстро решается.
function firebaseQuery(keys){
const result = [];
return new Promise((resolve, reject) => {
keys.forEach((key) => {
const snap = app.child(key).once('value');
const snapJSON = await snap.then(snapshot => snapshot.toJSON());
result.push({ key: key, post: snapJSON });
console.info(result);
});
resolve(result);
});
}
forEach
не делает паузу для операторов ожидания, поэтому это не будет работать так (https://codeburst.io/javascript-async-await-with-foreach-b6ba62bbf404). Лучше сопоставить ключи с массивом промисов, а затем использовать Promise.all(), чтобы дождаться их разрешения. Что-то вроде этого (только не забудьте обработать свои ошибки)
async function firebaseQuery(keys){
const result = await Promise.all(keys.map(async key => {
const snap = app.child(key).once('value');
const snapJSON = await snap.then(snapshot => snapshot.toJSON());
const returnValue = { key: key, post: snapJSON };
console.info(returnValue);
return returnValue;
}));
}