如何将Firestore查询转换为Javascript数组

时间:2018-09-27 05:31:13

标签: arrays firebase google-cloud-firestore es6-promise

我正在尝试导出执行查询的firestore函数,并返回包含该查询中对象的数组。我正在尝试从文档的子集合中获取数据,并获取返回以呈现给客户端的文档对象数组。

我已经尝试了以下方法,但没有用(例如,对象返回空白)。我认为这与对诺言的处理不当有关,但我自己无法解决。感谢您的帮助。

export const getEvents = (id) => {
  let events = [];
  firestore.collection('users')
    .doc(id)
    .collection('events')
    .get()
    .then((snapshot) => {
      snapshot.forEach((doc) => events.push(doc));
    });
    return events;
 };

1 个答案:

答案 0 :(得分:0)

您正确地确定了此问题与诺言的处理有关。您要返回事件数组,然后才能填充它,因为promise尚未解决。

如果您的环境允许,我建议您使用async / await,因为它使代码更易于阅读和理解,例如:

export const getEvents = async (id) => {
    let events = [];
    const snapshot = await firestore.collection('users')
        .doc(id)
        .collection('events')
        .get()
    snapshot.forEach((doc) => events.push(doc));
    return events;
};

但是如果您不能使用async / await,则可以使用promises。但是您只需要在获取数据后解决承诺:

const getEvents = (id) => {
    return new Promise((resolve, reject) => {
        let events = [];
        const snapshot = firestore.collection('users')
            .doc(id)
            .collection('events')
            .get()
            .then((snapshot) => {
                snapshot.forEach((doc) => events.push(doc));
                resolve(events); // return the events only after they are fetched
            })
            .catch(error => {
                reject(error);
            });
    });
};