微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

firebase 的异步 Javascript 请求问题

如何解决firebase 的异步 Javascript 请求问题

我正在尝试生成一个包含来自 firebase 的信息的表格,但我不知道如何使其可靠。我制作了一个带有 setTimeout() 的版本以显示给我的同事,但如果列表更大或互联网连接不好,这就不可靠。我删除 setTimeout 时的问题是它返回一个空对象(liste),因为 forEach 不等待数据到来。这种问题有可靠和干净的解决方案吗? (我对 Promises 和 awaits 不是很熟悉)。

这是函数

aFirebaseRequest.get()
    .then((data) => {
        var liste = [];
        listing.innerHTML = "";
        data.forEach((eleve) => {                                   <= HERE
            anotherFirebaseRequest1.get()
            .then((docEleve) => {
                if(docEleve.data().userCategory == "student") {
                    anotherFirebaseRequest2.get()
                    .then((docParent) => {
                        var tarifFormule = 0; var nomFormule = "";
                        if(docParent.docs.length != 0) {
                            anotherFirebaseRequest3.get()
                            .then((docFormule) => {
                                tarifFormule = docFormule.data().tarif
                                nomFormule = docParent.docs[0].data().formule;
                                if(liste.some((test) => test.id == eleve.data().idUser)) { 
                                    liste[liste.findindex((test) => test.id == eleve.data().idUser)].activity += 1
                                } else { liste.push({id : eleve.data().idUser,name: docEleve.data().firstName + ' ' + docEleve.data().lastName,activity: 1,nomFormule: nomFormule,tarifFormule: tarifFormule})};
                            }).catch((e) => console.log("Erreur : ",e))
                        } else {
                            tarifFormule = 0; nomFormule = "Aucune formule associé à cet élève";
                            if(liste.some((test) => test.id == eleve.data().idUser)) { 
                                liste[liste.findindex((test) => test.id == eleve.data().idUser)].activity += 1
                            } else { liste.push({id : eleve.data().idUser,tarifFormule: tarifFormule})};
                        }
                    }).catch((e) => console.log("Erreur : ",e))
                }}).catch((e) => console.log("Erreur : ",e))})
        return liste                                                     <= HERE
    }).then((liste) => {
        setTimeout(() => {liste.forEach((eleve) => {
            listing.innerHTML += `<tr><td style="padding-left: 0.1%; padding-right: 0.1%;">` + eleve.nomFormule + `</td><td style="padding-left: 0.1%; padding-right: 0.1%;">` + eleve.name + `</td><td style="padding-left: 0.1%; padding-right: 0.1%;"id="' + elem.matiere + 'Note1">` + eleve.activity + `</td><td style="padding-left: 0.1%; padding-right: 0.1%;">` + (eleve.tarifFormule * eleve.activity).toFixed(2) + ` €</td><td style="padding-left: 0.1%; padding-right: 0.1%;"><input style="text-align: center; width: 65%" type="number" name="" id="" min="0" max="100" placeholder="Réduction" step="5" oninput="this.value = !!this.value && Math.abs(this.value) >= 0 ? Math.abs(this.value) : null"><label>&nbsp %</label></td><td style="padding-left: 0.1%; padding-right: 0.1%; display: none">` + eleve.id + `</td></tr>`; 
        })},1500)
    }).catch((e) => console.log("Erreur : ",e))

我用 Promise.all 和类似的东西尝试了很多版本,但我从来没有让它们运行良好......

如果你有什么解决方案我会采纳¯_(ツ)_/¯

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。