如何访问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 循环中访问前一个和下一个元素的值