Javascript while循环中的setTimeout()方法
我已经阅读了关于w3schools和其他类似问题的相关页面,但似乎无法理解以下bit的错误:Javascript while循环中的setTimeout()方法,javascript,while-loop,settimeout,Javascript,While Loop,Settimeout,我已经阅读了关于w3schools和其他类似问题的相关页面,但似乎无法理解以下bit的错误: var myfunc03 = function (i) { document.getElementById('d01').innerHTML += 100-i+"<br>"; }; var myFunc01 = function() { i=0; while (i<100) { setTimeout(myfunc03(i), 1000) i++; }
var myfunc03 = function (i) {
document.getElementById('d01').innerHTML += 100-i+"<br>";
};
var myFunc01 = function() {
i=0;
while (i<100) {
setTimeout(myfunc03(i), 1000)
i++;
}
};
var myfunc03=函数(i){
document.getElementById('d01')。innerHTML+=100-i+“
”;
};
var myFunc01=函数(){
i=0;
虽然(iwhile
循环将不会等待完成。您需要为每个循环设置不同的时间延迟,以不同的时间执行它们,并使用闭包来保存i
的值。同样,在您的情况下,函数将首先执行,返回值设置为中的参数,因此您需要在匿名函数中调用该函数或直接设置该函数
var myFunc01=function(){
var i=0;
而(i<100){
(职能(一){
setTimeout(函数(){
document.getElementById('d01')。innerHTML+=100-i+“
”;
},1000*i)
})(i++)
}
};
myFunc01();
while方法运行速度很快,所有超时几乎都在第一秒后执行。您可以做的是
myfunc03
调用$timeout
以获取下一个值i*1000
setTimeout
使用匿名函数,如
...
while (i<100) {
setTimeout(
function(i){
myfunc03(i);
}, i*1000);
i++;
}
...
。。。
而(我
- 我认为setTimeout中缺少分号,您应该尝试以以下方式传递参数:
setTimeout(myfunc03, 1000*i, i);
是。您的代码中有两个问题:
- 函数接受函数作为第一个参数,但在代码中,
myfunc03(i)
不返回任何内容
- while循环不能满足您的需要,相反,您必须使用递归函数。因为第二个函数应该在触发第一个超时后调用
示例代码:
var myfunc03=函数(i){
setTimeout(函数(){
document.getElementById('d01')。innerHTML+=100-i+“
”;
如果(i<100){
i++;
myfunc03(i);
}
}, 1000);
};
var myFunc01=函数(){
myfunc03(0);
};
myFunc01();
您可以使用递归更简单地执行:
var i = 0;
function f1() { ... };
function f() {
f1();
i += 1;
setTimeout(function() {
if(i < 100) {
f();
}
}, 1000);
}
f();
var i=0;
函数f1(){…};
函数f(){
f1();
i+=1;
setTimeout(函数(){
如果(i<100){
f();
}
}, 1000);
}
f();
例子
var i=0;
var myfunc03=函数(i){
document.getElementById('d01')。innerHTML+=100-i+“
”;
};
var myFunc01=函数(){
myfunc03(i);
i+=1;
setTimeout(函数(){
如果(i<100){
myFunc01();
}
}, 1000);
}
myFunc01();
等待设置超时时
:
(async () => {
var i = 0;
while (await new Promise(resolve => setTimeout(() => resolve(i++), 1000)) < 100) {
console.log("I get printed 100 times every second");
}
})();
(异步()=>{
var i=0;
while(等待新承诺(resolve=>setTimeout(()=>resolve(i++),1000))<100){
log(“我每秒打印100次”);
}
})();
一个简单的选择是使用setInterval()
方法。
setInterval每次都将作为循环执行代码,直到您使用clearInterval()
方法将其中断
示例:
var i = 0;
function f1() { ... };
function f() {
f1();
i += 1;
setTimeout(function() {
if(i < 100) {
f();
}
}, 1000);
}
f();
var指数=0;
让incrementEveryHalfSecond=setInterval(函数(){
索引++;
document.querySelector(“body”).innerHTML+=index+'';
如果(索引==10)clearInterval(每半秒递增一次)
},500)
这当然突出了他的第二个错误——访问修改过的变量(i
)在闭包内。当超时触发时,i
将更改为最后一个参数。setTimeout
要求将函数
作为第一个参数,但您正在传递myfunc03
的结果(这是定义不足的,因为您正在调用它)请写下你的答案。这是不可读的,也不是understandable@mplungjan是的,我的错!你没有解决关闭问题我知道,其他人已经这样做了,最初我错过了。所以我只是修改了我原来的答案。我觉得抄袭别人的答案是不对的:)@mplungjan没关系。我写东西不只是为了选票或名誉。只是消磨一些空闲时间,帮助其他程序员:)无论如何,正如您坚持的那样,更正了答案对于现代浏览器来说,这是最好的解决方案,因为它避免了闭包的尴尬。但是,第二个参数应该是1000*i
;否则,您将同时将100个超时设置为1s。与Yea相比,这是正确的。我打算只显示语法方面的,因为这是might导致了js错误。他可能会根据他的逻辑要求使用时间参数。详细解释。我遇到了相同的问题。非常好的示例,谢谢!