捕获计数器功能范围的值
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。
代码通过了 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。