我需要遍历一系列setTimeout函数,以迭代方式更改函数参数和超时值。
如here所述,在打印值时,setTimeout在for循环中执行(显然)很奇怪。您可以使用let
或定义另一个函数来解析。
这按预期工作:每秒打印一次
function doSetTimeout(i) {
setTimeout(function() { console.log(i); }, i * 1000);
}
for (var i = 1; i <= 5; ++i)
doSetTimeout(i);
这无法按预期工作:每秒,五秒钟,第二秒等依次打印i。而不是0、1、2、3、4,它会在浏览器控制台中记录4、0、2、1、3
times = [1,5,1,5];
function doSetTimeout(i) {
setTimeout(function() { console.log(i); }, times[i] * 1000);
}
for (var i = 0; i <= 4; ++i)
doSetTimeout(i);
我已经尝试过使用let
和一个匿名函数,但也没有成功。
答案 0 :(得分:0)
在dosetTimeout方法中放置以下代码:正如我在评论中提到的
//捕获“ i”的当前状态 //通过调用具有当前值的函数
(function(i) {
setTimeout(function() { console.log(i); }, times[i] * 1000)
})(i);
答案 1 :(得分:0)
我根据您的示例编写了快速解决方案。
var i = 0;
var times = [1,5,1,5];
function wait(milleseconds) {
return new Promise(resolve => setTimeout(resolve, milleseconds))
}
async function myLoop (times,i) {
await wait(times[i]*1000);
i++;
alert('HI');
if(i<times.length)
myLoop(times,i);
}
myLoop(times,i);
答案 2 :(得分:0)
我没有意识到我必须将以前的时间加到总数中才能获得顺序的等待。这有效:
previous = 0;
times = [1000,5000,1000,5000];
function doSetTimeout(i) {
setTimeout(function() { console.log(i); }, times[i] + previous);
previous += times[i]
}
for (var i = 0; i <= 3; ++i)
doSetTimeout(i);