我正在尝试在for循环外访问变量的新值。
这是针对用户每次将卡移动到正确索引(所有内容都存储在indexedDB中)时获得积分的系统。我已经尝试过创建一个全局变量,但是当我将其移到循环外时,它会回到0。当我在循环中访问它时,我可以看到新值。我需要一个新函数的新值,该函数将按降序存储不同的值(主要是制作排行榜)。 现在的代码如何:
let danielCounter = 0;
for (let i = 1; i < doneTasks.result+1; i++) {
let getTasks = tasksStore.get(i);
getTasks.onerror = function() {
}
getTasks.onsuccess = function() {
if (getTasks.result.memberFullName == "Daniel") {
danielCounter++;
} else if (condition) {
//something to be executed;
}
}
}
console.log("d: " + danielCounter);
我希望console.log显示“ d:5”,因为如果console.log在for循环内,它将显示该内容,但是它将显示“ d:0”,即它的值开头。
答案 0 :(得分:0)
我的猜测是,由于tasksStore.get(i)
是异步调用,因此onsuccess
函数在console.log("d: " + danielCounter);
之后被称为 synchronous 指令被调用。尝试等待几秒钟以打印变量值,或将console.log
放入onsuccess
内。
查看this link,了解有关同步和异步过程的更多信息。
答案 1 :(得分:0)
tasksStore.get(i)调用可能是异步进行的,因此您将在收到所有结果之前退出循环。
您可以尝试在异步函数中等待响应,如下所示
let danielCounter = 0;
getDanielCount();
async function getDanielCount(){
for (let i = 1; i < doneTasks.result+1; i++) {
let getTasks = await tasksStore.get(i);
getTasks.onerror = function() {
}
getTasks.onsuccess = function() {
if (getTasks.result.memberFullName == "Daniel") {
danielCounter++;
} else if (condition) {
//something to be executed;
}
}
}
console.log("d: " + danielCounter);
}
答案 2 :(得分:0)
有些事情可能会引起问题。
JavaScript是单线程的,并具有基于“事件循环”的并发模型。 因此,执行代码的顺序如下。
1. let danielCounter = 0;
2.
3. for (let i = 1; i < doneTasks.result+1; i++) {
4. //taskStore.get is blocking method-- the method pushed into event event
5. // The control moves to next unblocked statement -- which is line 20!!
6. let getTasks = tasksStore.get(i);
7.
8. getTasks.onerror = function() {
9.
10. }
11.
12. getTasks.onsuccess = function() {
13. if (getTasks.result.memberFullName == "Daniel") {
14. danielCounter++;
15. } else if (condition) {
16. //something to be executed;
17. }
18. }
19.}
20. console.log("d: " + danielCounter);
相反,请尝试此代码
async function getDanielCount() {
let danialCount = 0;
for( i=0; i< tasksStore.length; i++) {
let getTasks = await tasksStore.get(i);
if (getTasks.result.memberFullName == "Daniel") {
danielCounter++;
} else if (condition) {
//something to be executed;
}
}
return danialCount;
}
(async () => {
let count = await getDanielCount();
console.log('Daniel count', count); // This should display correct count
})();
我注意到的另一件事是taskStore.get(i)返回一个对象“ getTasks”,而成功和错误函数是新创建的getTask对象的成员。通常,您分别编写成功和失败函数,并将函数传递给getTask方法,以接收来自getTask函数的回调。