捕获计数器功能范围的值

Capture the value of counter - functional scope

代码通过了 if 条件,但无法捕获 counter 的变化。整个过程counter的值还是0。

 let counter = 0;
            database
            .collection("bookings")
            .get()
            .then((snapshot) => {
                snapshot.docs.forEach((doc) => {
                    var booking = doc.data();
                    if (((booking.paxGroup === paxGroup) && (booking.restaurantName === restName)) 
                    && ((booking.mallName === mallName) && (booking.queueStatus === "waiting"))) {
                        counter += 1;
                    }
                })
            });
            alert(counter)

你这里有一个竞争条件

这是正在发生的事情

let counter = 0;        // Synchronous

database....then(...)   // Asynchronous (needs to wait on fetching data)

alert(counter);         // Synchronous

因此代码运行的顺序是

let counter = 0;        // 1

alert(counter);         // 2

database....then(...)   // 3 (after the database's get() call is complete)

如何仔细检查:

继续将另一个 alert(counter) 放在 counter += 1 下,您会看到计数器增加了。

你的counter还是0,是因为alert(counter)在counter +=1执行之前运行;

原因是 database.collection("bookings").get() 是一个 Promise。这意味着括号内的函数作为异步函数运行,这就是这段代码按自己的时间运行的原因。

您可以阅读有关 Promises 的更多信息 here