返回嵌套的Promise.all结果在firebase函数onCall

时间:2019-07-23 00:37:11

标签: javascript firebase google-cloud-firestore google-cloud-functions es6-promise

我正在创建一个云函数,该函数接收来自客户端的呼叫,包括当前用户ID。我想要实现的是从当前用户ID下的“用户”集合中获取朋友ID列表,然后为每个朋友ID从名为“位置”的集合中获取对象列表。下面的代码具有正确的查询,但是关于promise处理和return语句存在一些混淆。如何从第二个“ then”内部正确返回结果?当前返回HttpsCallableResult并将数据作为空映射,甚至认为它应该包含2个对象。

exports.friendsData = functions.https.onCall((data, context) => {
    return admin
        .firestore()
        .collection('users')
        .doc(data.id)
        .get()
        .then(snapshot => {
            const friendsIds = snapshot.data().friends;
            console.log('friendsIds', friendsIds);

            return Promise.all(
                friendsIds.map(id => {
                    console.log('id', id);
                    return admin
                        .firestore()
                        .collection('locations')
                        .where('userid', '==', id)
                        .get();
                })
            );
        })
        .then(locationSnapshots => {
            const results = [];
            for (const locationSnap of locationSnapshots) {
                const data = locationSnap.data();
                console.log('data', data);

                results.push(data);
            }
            console.log('resuts', resuts);
            return resuts;
        })
        .catch(reason => {
            return reason;
        });
});

编辑 locations集合包含带有自动生成的id的文档,并且每个文档都有一个名为“ userid”的字段,该字段用于where查询 Image for location collection structure

基于注释的更新代码。 locationSnapshots应该是之前添加的每个promise的查询快照的数组。仍然不确定。

1 个答案:

答案 0 :(得分:0)

我将在答案中记录迄今为止我们发现的错误之处:

首先,您需要在.get()之后输入.where(...)来获得承诺。

第二,如果friendsIds是一个数组,而您要迭代该数组的内容,请更改此内容:

for (const id in friendsIds)

对此:

for (const id of friendsIds)

使用in时,它会迭代对象的属性,在数组的情况下,该属性将是数组索引,而不是数组值。

由于尝试从数组创建数组,因此最好切换为使用.map()。更改此:

        const promises = [];
        for (const id in friendsIds) {
            const p = admin
                .firestore()
                .collection('locations')
                .where('userid', '==', id)
                .get();
            promises.push(p);
        }

        return Promise.all(promises);

对此:

        return Promise.all(friendsIds.map(id => {
            return admin
                .firestore()
                .collection('locations')
                .where('userid', '==', id)
                .get();
        }));