首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何访问for循环外部的值

如何访问for循环外部的值
EN

Stack Overflow用户
提问于 2019-06-05 00:04:51
回答 1查看 57关注 0票数 0

我试图在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“,这是它开始时的值。

EN

回答 1

Stack Overflow用户

发布于 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函数的回调。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56447558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档