forEach с вызовом Firebase - PullRequest
       7

forEach с вызовом Firebase

2 голосов
/ 08 апреля 2020

Я пытаюсь подтвердить бронирование, сравнивая столкновения с другими бронированиями (вызываемыми индивидуально из БД) в расписании тренера на сайте бронирования.

Я знаю, что вызовы Firebase являются асинхронными, поэтому мне нужно найти способ ожидания получения и проверки всех заказов внутри функции forEach.

Я попытался поместить переменную-флаг перед forEach и console.logged в конце, но, очевидно, он не работает, так как console.log не будет ждать завершения forEach перед запуском.

Я читал об 'asyn c await', но похоже, что для этого сценария будет слишком много (?). Может ли быть более простой способ сделать это?

Любая помощь приветствуется.

                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 голос
/ 09 апреля 2020
  1. Измените forEach на map
  2. Верните обещание, полученное в результате этого вызова db внутри карты.
  3. Верните логическое значение, если у вас есть консоль журналы. Допустим, истина означает доступность.
  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);
});
...