使用 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个回答
-
将
forEach
更改为map
-
返回 map 中
db
调用所产生的承诺。 - 返回一个布尔值,其中包含控制台日志。假设 true 表示可用。
-
现在
map
的结果将是一个承诺数组,解析为所有布尔值。 -
使用
Promise.all
等待所有这些承诺 -
在其后放置一个
then
。它将接收布尔值数组。 - 如果所有这些都为真,则时间段可用。
代码:
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