我想在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'),以此类推。
据我所知,setTimeout函数是异步调用的。你能做的是将整个循环包装在一个异步函数中,并等待一个包含setTimeout的Promise,如下所示:
var looper = async function () {
for (var start = 1; start < 10; start++) {
await new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("iteration: " + start.toString());
resolve(true);
}, 1000);
});
}
return true;
}
然后像这样调用运行它:
looper().then(function(){
console.log("DONE!")
});
请花些时间好好理解异步编程。
下面是我如何创建一个无限循环的延迟,在特定条件下中断:
// Now continuously check the app status until it's completed,
// failed or times out. The isFinished() will throw exception if
// there is a failure.
while (true) {
let status = await this.api.getStatus(appId);
if (isFinished(status)) {
break;
} else {
// Delay before running the next loop iteration:
await new Promise(resolve => setTimeout(resolve, 3000));
}
}
这里的关键是创建一个通过超时解析的新Promise,并等待它的解析。
显然你需要async/await支持。工作在Node 8。
除了10年前接受的答案之外,使用更现代的Javascript,可以使用async/await/Promise()或生成器函数来实现正确的行为。(其他答案中建议的错误行为是设置一系列3秒警报,而不管“接受”警报()-或完成手头的任务)
使用异步/等待/承诺():
alert('嗨');
(async () => {
For (let start = 1;起始值< 10;开始+ +){
等待新的承诺(resolve => setTimeout(() => {
alert('你好');
解决();
}, 3000));
}
}) ();
使用生成器函数:
警报(“嗨”);
让函子;
(func = (function*() {
for(let start = 1, start < 10, start++) {
yield setTimeout(() => {
警报(“你好”);
func.next();
}, 3000);
}
})()).next();
非常简单的单行解决方案,具有实际的异步等待延迟(没有排队setTimeout):
下面的(自动执行匿名)函数在循环之间创建一个实际的延迟,而不是具有不同超时的多个settimeout,这可能会弄乱内存。
在100个循环中的每一个循环中,它都等待一个新的承诺来解决。
这只发生在setTimeout '允许'它在90ms后。在此之前,代码将被async-await / pending Promise阻塞。
(async () => {
For(令i=0;我< 100;我+ +){
等待新的承诺((resolve) => {setTimeout(() =>{文档。我写(“${}”);解决(true)}, 90)});
}
})()
我只是想在这里发表我的意见。此函数运行具有延迟的迭代循环。请看这个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);
}