如何访问for循环外的值

Posted

技术标签:

【中文标题】如何访问for循环外的值【英文标题】:How to access a value outside a for loop 【发布时间】:2019-06-04 16:04:51 【问题描述】:

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

【问题讨论】:

您只是将函数设置为成功而不是调用它。所以danielCounter++; 永远不会被执行。 看起来它永远不会到达 danielCounter 递增的代码 【参考方案1】:

我的猜测是,由于tasksStore.get(i) 是一个异步 调用,因此onsuccess 函数在console.log("d: " + danielCounter); 同步之后被调用 em> 指令被调用。尝试等待几秒钟以打印变量值,或者将console.log 放入onsuccess

查看this link,了解有关同步和异步进程的更多信息。

【讨论】:

【参考方案2】:

taskStore.get(i) 调用可能是异步进行的,因此您将在收到所有结果之前退出循环。

您可以尝试在异步函数中等待响应,类似这样

让丹尼尔计数器= 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);

【讨论】:

【参考方案3】:

有几件事可能会导致问题。

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

【讨论】:

以上是关于如何访问for循环外的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在已排序的 xsl:for-each 循环中访问前一个和下一个元素的值

jQuery - 使用“for-each”循环更改循环外的变量

for循环外的变量范围

无法从嵌套for循环访问父for循环

Java - for 循环声明外的逗号运算符

是否可以从 v-for 循环外部访问 v-for 中变量的值?