在Firebase快照foreach中等待?

时间:2019-08-29 20:02:11

标签: javascript node.js firebase google-cloud-firestore

我有一个监视通知收集的功能,但是在快照中,我需要执行一个等待功能。

async function getNotifications() {
    try {
        firebase.firestore().collection("notifications").doc(firebase.auth().currentUser.uid).collection("messages")
            .onSnapshot((qs) => {
                const array = [];
                const promises = [];
                qs.forEach(async(n) => {
                    let data = n.data();
                    data.id = n.id;
                    if(data.type === "download") await storageGetDownloadURL(data.filepath);
                    array.push(data)
                });
                console.log(array)
                return setNotifications(array);
            });
    } catch (e) {
        message.error(e.message)
    }
}

此行导致问题的原因是if(data.type === "download") promises.push(await storageGetDownloadURL(data.filepath));。如果我保留它,则将填充数组,但是它有问题。在其上执行.length表示它为空,否则不为空。

如果我删除此行,则表示阵列已正确完成。

是否可以在快照中执行等待?我也尝试过将它们推到数组中,然后再调用它们,但是仍然存在相同的问题。

编辑:建议的重复问题不适用于Firebase快照。抛出qs is not iterable

                    for(const n of qs) {
                        let data = n.data();
                        data.id = n.id;
                        if(data.type === "download") await storageGetDownloadURL(data.filepath);
                        array.push(data)
                    }

我也按照@Doug Stevenson的建议进行了尝试,但是,如果我先注销array,然后注销array.length,我会得到一些奇怪的结果,即数组为空,但包含项,而length也表示为空

注意:我不必履行承诺就可以打破

   const promises = [];

                qs.forEach(async(n) => {
                    let data = n.data();
                    data.id = n.id;
                    if(data.type === "download") promises.push(await storageGetDownloadURL(data.filepath));
                    array.push(data)
                });
                console.log(array)
                console.log(array.length)

enter image description here

由于此操作已关闭,因此我通过在循环内创建新的Promise并随后执行此操作,成功完成了此半工。虽然诺言中的等待不会引起问题,但不会执行

            firebase.firestore().collection("notifications").doc(firebase.auth().currentUser.uid).collection("messages")
                .onSnapshot(async(qs) => {
                    const array = [];
                    const promises = [];

                    qs.forEach((n) => {
                        promises.push(new Promise(async(res, rej) => {
                            let data = n.data();
                            data.id = n.id;
                            if(data.type === "download") await storageGetDownloadURL(data.filepath);
                            array.push(data);
                            return res();
                        }));
                    });
                    await Promise.all(promises);
                    return setNotifications(array);
                });

0 个答案:

没有答案