如何在for循环之外访问值

时间:2019-06-04 16:04:51

标签: javascript loops save

我正在尝试在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”,即它的值开头。

3 个答案:

答案 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函数的回调。