开发者问题收集

使用 Firebase 调用 forEach

2020-04-08
69

我试图通过将冲突与预订网站中培训师时间表中的其他预订(从数据库中单独调用)进行比较来验证预订。

我知道 Firebase 调用是异步的,因此我需要找到一种方法来等待 forEach 函数内的所有预订都被获取和验证。

我尝试在 forEach 之前放置一个标志变量,并在其末尾对其进行 console.logged,但显然它不起作用,因为 console.log 不会等待 forEach 完成后再运行。

我读过关于“异步等待”的文章,但对于这种情况来说,它似乎有点过度了(?)。 有没有更简单的方法可以做到这一点?

任何帮助表示感谢。

                const bookingData = {
                    coursename:this.state.coursename,
                    location:this.state.location,
                    trainerid:this.state.trainerid,
                    startDatetime: this.state.startDatetime,
                    endDatetime: this.state.endDatetime,
                } //FORM DATA I WANT TO VALIDATE


                db.collection('timetables').doc(timetableid).get().then(timetable=>{

                    const data = timetable.data(); //ARRAY OF BOOKING ID'S

                    data.bookings.forEach(bookingid=>{

                        db.collection('bookings').doc(bookingid).get().then(bookingref=>{

                        //FOR EACH 'BOOKING' DOCUMENT IN MY DB, I WANT TO PERFORM THE FOLLOWING OPERATION

                            const booking = bookingref.data().bookingInfo;

                            if( booking.startDatetime.toDate() <= bookingData.startDatetime &&
                                booking.endDatetime.toDate() >= bookingData.startDatetime &&
                                booking.startDatetime.toDate() <= bookingData.endDatetime &&
                                booking.endDatetime.toDate() >= bookingData.endDatetime) {

                                console.log('TIME SLOT UNAVAILABLE')                             
                            }
                            else {
                                console.log('TIME SLOT AVAILABLE')                              
                            }
                        }).catch(err=>console.log(err));

                    });
                })

                // FIND A WAY TO SEE IF THE BOOKING WAS VALID AFTER BEING COMPARED WITH ALL OF THE BOOKINGS IN THE DB
1个回答
  1. forEach 更改为 map
  2. 返回 map 中 db 调用所产生的承诺。
  3. 返回一个布尔值,其中包含控制台日志。假设 true 表示可用。
  4. 现在 map 的结果将是一个承诺数组,解析为所有布尔值。
  5. 使用 Promise.all 等待所有这些承诺
  6. 在其后放置一个 then 。它将接收布尔值数组。
  7. 如果所有这些都为真,则时间段可用。

代码:

Promise.all(
  data.bookings.map(
    booking => db....get().then(bookingRef => {
      // return true or false based on your condition
    })
  )
).then(results => {
  // this will wait for all the db calls to complete.
  // and you get all the booleans in the results array.
  const isAvailable = !results.includes(false);
});
zord
2020-04-08