我试图在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: 5“,但实际上它显示的是”d: 0“,这是它开始时的值。
发布于 2019-06-05 08:40:56
有几件事可能会导致问题。
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
})();
我注意到的另一件事是tasksStore.get(i)返回一个'getTasks‘对象,您的成功和错误函数是新创建的getTask对象的成员。通常,您分别编写成功和失败函数,并将函数传递给getTask方法以接收来自getTask函数的回调。
https://stackoverflow.com/questions/56447558
复制相似问题