javascript - For循环不会迭代
问题描述
我有一个可以完美运行的函数,直到我把它放在一个 for 循环中——此时我在 Safari 中得到一个参考错误(找不到 i)。在 Chrome 和 Firefox 中,它只运行在第一次迭代中(即 i = 0)。这是怎么回事?
编辑:这里 for 循环的重点是在其中的函数(包括超时)完成时进行迭代。如果有人对如何做到这一点有其他建议,那就太好了。
没有for循环的函数:
let realScores = [40,7, 3, 2]
let scores = [0,0,0,0]
let i = 0
let counter = 0
function timer() {
setTimeout(() => {
scores[i]++
console.log(i, scores[i])
if (scores[i] < realScores[i]) {
timer()
}
}, 10)
}
timer()
并使用 for 循环:
let realScores = [40,7, 3, 2]
let scores = [0,0,0,0]
for (let i = 0; i < scores.length; i++) {
let counter = 0
function timer() {
setTimeout(() => {
scores[i]++
console.log(i, scores[i])
if (scores[i] < realScores[i]) {
timer()
}
}, 10)
}
timer()
}
解决方案
For 循环是同步的,这意味着它们将在setTimeout
完成之前执行 - 您不能暂停 for 循环的执行以等待setTimeout
回调的解决。
幸运的是,您可以使用Promise
s 和async
/await
来阻止执行 for 循环以等待setTimeout
解决:
let realScores = [40,7, 3, 2]
let scores = [0,0,0,0]
function timer(i) {
return new Promise((resolve, reject) => {
const t = () => {
setTimeout(() => {
scores[i]++;
console.log(i, scores[i])
if (scores[i] < realScores[i]) {
t();
} else {
resolve();
}
}, 10);
}
t();
});
}
(async() => {
for (let i = 0; i < scores.length; i++) {
let counter = 0;
await timer(i);
}
console.log(scores);
})();
推荐阅读
- javascript - 从一个位置在操作系统上安装的所有浏览器中运行 JavaScript 脚本
- python - 如何将字符串拆分为变量
- java - 如何在Java矩阵(二维数组)中围绕10乘10 0的矩阵制作1的“边界”
- python - 无法将熊猫数据框附加到现有的 Excel 工作表
- java - Android Studio 项目级 build.gradle 错误
- excel - 宏从 txt 文件中提取不正确的数据
- node.js - 从共享 linux 托管服务器连接到 mongodb Atlas 时出错
- webrtc - 错误:ast_sockaddr_resolve:getaddrinfo(“a783543c-1911-44c4-9ba1-52114bbdccb4.local”,“(null)”,...):名称或服务未知
- python - 如何更新 Matplotlib.patches.Ellipse 对象的角度?
- android - 向sqlite数据库插入数据