Ce que j'essaie d'accomplir, c'est en cliquant sur un bouton que <script> exécutera 2 actions de document. la première action mettra à jour un ancien document dans ce cas un document nommé le 30 novembre 2019, et changera l'un de ses champs nommé isActive en false. La deuxième action définira un nouveau document nommé quelle que soit la date actuelle à laquelle l'utilisateur exécutera ladite action.

Pour le moment, aucune de ces actions ne fonctionne. Mais la deuxième action fonctionne avant d'ajouter ce code (c'est censé être le premier code d'action qui met à jour le champ de l'ancien document) :

let userRef1 = firebase.firestore().collection("users").doc(userId).collection("goal").orderBy("dateAdded", "desc").limit(1);
                                            return userRef1.get()
                                            .then(function(querySnapshot) {
                                                querySnapshot.forEach(function(doc) {
                                                    console.log(doc.id, " => ", doc.data());
                                                    this.getDateBeforeUpdate = doc.id; //this get the document ID or the date in this case (Nov 30, 2019)
                                            });
                                        })

                                    await firebase.firestore().collection("users").doc(userId).collection("goal").doc(getDateBeforeUpdate).update({
                                        'isActive': false,
                                        });

Voici le code complet qui effectue les deux actions :

                                let userRef1 = firebase.firestore().collection("users").doc(userId).collection("goal").orderBy("dateAdded", "desc").limit(1);
                                        return userRef1.get()
                                        .then(function(querySnapshot) {
                                            querySnapshot.forEach(function(doc) {
                                                console.log(doc.id, " => ", doc.data());
                                                this.getDateBeforeUpdate = doc.id; //this get the document ID or the date in this case (Nov 30, 2019)
                                        });
                                    })

                                await firebase.firestore().collection("users").doc(userId).collection("goal").doc(getDateBeforeUpdate).update({
                                    'isActive': false,
                                    });

                                if( getDateAndConsent.getGoalDate.getTime() >= date1.addDays().getTime() ){
                                     if(getDateAndConsent.getYN == "Yes"){
                                        await firebase.firestore().collection("users").doc(userId).collection("goal").doc(americanDate).set({
                                            'startRange': startRange, 'endRange': endRange, 'dateAdded': data.dateAdded, 
                                            'isActive': data.isActive, 'doesmaintainBG': data.doesMaintainBG, 'goalDate': firebase.firestore.Timestamp.fromDate(data.goalDate),
                                            'goalWeight': data.inputWeight, 'goalForWeight': data.goalForWeight,
                                        })
                                        .then(function(){
                                            window.alert("Weight goal updated!");
                                            window.location.href = "diabetesManagement.php"; 
                                        })
                                        .catch(function(error){
                                            console.log("Error updating weight goal: ", error);
                                            window.alert("Error updating weight goal: " + error);
                                        })
                                    }
                                    else if(getDateAndConsent.getYN == "No"){
                                        await firebase.firestore().collection("users").doc(userId).collection("goal").doc(americanDate).set({
                                            'dateAdded': data.dateAdded, 'isActive': data.isActive, 
                                            'doesmaintainBG': data.doesMaintainBG, 'goalDate': firebase.firestore.Timestamp.fromDate(data.goalDate),
                                            'goalWeight': data.inputWeight, 'goalForWeight': data.goalForWeight,
                                        })
                                        .then(function(){
                                            window.alert("Weight goal updated!");
                                            window.location.href = "diabetesManagement.php"; 
                                        })
                                        .catch(function(error){
                                            console.log("Error updating weight goal: ", error);
                                            window.alert("Error updating weight goal: " + error);
                                        });
                                    }
                                    else{
                                        window.alert("error");
                                    }
                                }
                                else{
                                    window.alert("error date: you can only input dates three weeks from now");
                                    window.location.href = "diabetesManagement.php"; 
                                }

Image de la base de données : entrez la description de l'image ici Lorsque toute l'action est exécutée, la base de données encerclée, le champ encerclé sera mis à jour. Ensuite, un nouveau document sera créé nommé/id la date actuelle.

0
setted 8 févr. 2020 à 21:33

1 réponse

Meilleure réponse

Bien que j'aie essayé la réponse de Doug Stevenson. J'ai encore du mal à l'appliquer. J'ai trouvé une solution de contournement en utilisant setTimeout() en cliquant sur le bouton, la première requête s'exécutera. Alors que le second sera mis en pause pendant 3 secondes avant de s'exécuter.

Le code va comme ceci:

                                if( getDateAndConsent.getGoalDate.getTime() >= date1.addDays().getTime() ){
                                     if(getDateAndConsent.getYN == "Yes"){
                                        firebase.firestore().collection("users").doc(userId).collection("goal").where("isActive", "==", true)
                                        .get()
                                        .then(function(querySnapshot) {
                                            querySnapshot.forEach(function(doc) {
                                                console.log(doc.id, " => ", doc.data());
                                                this.getDateBeforeUpdate = doc.id; //this get the document ID or the date in this case (Nov 30, 2019)
                                                firebase.firestore().collection("users").doc(userId).collection("goal").doc(getDateBeforeUpdate).update({
                                                    'isActive': false,
                                                })
                                            })
                                        })
                                        setTimeout(function(){firebase.firestore().collection("users").doc(userId).collection("goal").doc(americanDate).set({
                                            'startRange': startRange, 'endRange': endRange, 'dateAdded': data.dateAdded, 
                                            'isActive': true, 'doesmaintainBG': data.doesMaintainBG, 'goalDate': firebase.firestore.Timestamp.fromDate(data.goalDate),
                                            'goalWeight': data.inputWeight, 'goalForWeight': data.goalForWeight,
                                        })
                                        .then(function(){
                                            window.alert("Weight goal updated!");
                                            window.location.href = "diabetesManagement.php"; 
                                        })
                                        .catch(function(error){
                                            console.log("Error updating weight goal: ", error);
                                            window.alert("Error updating weight goal: " + error);
                                        })}, 3000);
                                    }

Bien que cela semble peu orthodoxe, je le considère toujours comme une solution de contournement. J'espère que cela vous aidera si vous avez du mal à mettre en œuvre transactions ou batch !

0
setted 11 févr. 2020 à 17:40