我想在while循环中添加一个delay/sleep:
我是这样试的:
alert('hi');
for(var start = 1; start < 10; start++) {
setTimeout(function () {
alert('hello');
}, 3000);
}
只有第一种情况是正确的:在显示alert('hi')后,它将等待3秒,然后alert('hello')将显示,但随后alert('hello')将不断重复。
我想要的是,在警报('hello')显示3秒后警报('hi'),然后它需要等待3秒的第二次警报('hello'),以此类推。
我只是想在这里发表我的意见。此函数运行具有延迟的迭代循环。请看这个jsfiddle。函数如下:
function timeout(range, time, callback){
var i = range[0];
callback(i);
Loop();
function Loop(){
setTimeout(function(){
i++;
if (i<range[1]){
callback(i);
Loop();
}
}, time*1000)
}
}
例如:
//This function prints the loop number every second
timeout([0, 5], 1, function(i){
console.log(i);
});
相当于:
//This function prints the loop number instantly
for (var i = 0; i<5; i++){
console.log(i);
}
在ES6 (ECMAScript 2015)中,您可以使用生成器和间隔迭代延迟。
生成器(generator)是ECMAScript 6的一个新特性,是可以被替换的函数
顿了顿,接着说。调用genFunc不会执行它。相反,它
返回一个所谓的生成器对象,让我们控制genFunc的
执行。genFunc()最初是挂起在它的开始
的身体。方法genObj.next()继续执行genFunc,
直到下一次丰收。
(探索ES6)
代码示例:
Let arr = [1,2,3, 'b'];
let genObj = genFunc();
let val = genObj.next();
console.log (val.value);
let interval = setInterval(() => {
val = genObj.next();
If (val.done) {
clearInterval(间隔);
}其他{
console.log (val.value);
}
}, 1000);
函数* genFunc() {
For (let item of arr) {
收益项;
}
}
所以如果你正在使用ES6,这是实现延迟循环的最优雅的方式(在我看来)。
非常简单的单行解决方案,具有实际的异步等待延迟(没有排队setTimeout):
下面的(自动执行匿名)函数在循环之间创建一个实际的延迟,而不是具有不同超时的多个settimeout,这可能会弄乱内存。
在100个循环中的每一个循环中,它都等待一个新的承诺来解决。
这只发生在setTimeout '允许'它在90ms后。在此之前,代码将被async-await / pending Promise阻塞。
(async () => {
For(令i=0;我< 100;我+ +){
等待新的承诺((resolve) => {setTimeout(() =>{文档。我写(“${}”);解决(true)}, 90)});
}
})()