如何使setTimeout()在for循环中工作? 像这样的代码
function hello() {
for (let index = 0; index < 3; index++) {
setTimeout(function () {
console.log('What\'s up!')
}, 3000)
console.log('Yo')
}
}
hello()
它记录
Yo
Yo
Yo
What's up!
What's up!
What's up!
如何使其成为日志
Yo
What's up(after 3 sec)
Yo
What's up(after 3 sec)
Yo
What's up(after 3 sec)
感谢您的帮助。
答案 0 :(得分:5)
做到这一点的一种方法是:
function hello() {
for (let index = 1; index <= 3; index++) {
setTimeout(function () {
console.log('What\'s up!')
}, 3000 * index)
setTimeout(function () {
console.log('Yo')
}, 3000 * (index - 1))
}
}
hello()
我基本上利用了for循环索引来给每个console.log
调用一个不同的延迟。请注意,“ Yo”总是比“ Whats up”快3000毫秒。
答案 1 :(得分:2)
承诺(没有async/await)
async function hello(index = 0) {
if (index >= 3) return;
index += 1;
return new Promise(function(resolve){
setTimeout(function(){
console.log('What\'s up!');
resolve();
}, 3000);
console.log('Yo');
}).then(hello.bind(null, index));
}
hello()
承诺(带有async/await)
async function hello() {
for (let index = 0; index < 3; index++) {
await Promise.all([
new Promise(function(resolve){
setTimeout(function(){
console.log('What\'s up!');
resolve();
}, 3000);
}),
console.log('Yo')
]);
}
}
hello()
递归
function hello(index = 0) {
if (index >= 3) return;
setTimeout(function(){
console.log('What\'s up!');
hello(index);
}, 3000);
console.log('Yo');
index++;
}
hello()
PS :上面的代码假定您使用ES2017及更高版本。
答案 2 :(得分:0)
setTimeout()也不会给您想要的结果。 要么将console.log都放在setTimeout()中,要么删除setTimeout()。
答案 3 :(得分:0)
您需要这样的东西:
const times = 3;
var n = 0;
function logYo(){
console.log('Yo');
logWhatsUp();
}
function logWhatsUp(){
setTimeout(() => {
console.log('Whats Up');
n++;
if(n < times)
logYo();
}, 3000);
}
logYo();
答案 4 :(得分:0)
您可以仅创建一个使用setTimeout()执行自身的函数,但必须将全局函数合并为计数器。
let counter = 0;
function hello(n){
console.log("Yo");
console.log("What's up?);
counter++;
if(counter > n){
setTimeout(hello, 3000);
}
}
答案 5 :(得分:-1)
使用Promises怎么样?
您可以等待setTimeout完成,然后再输出“最新消息!”。像这样:
function hello() {
for (let index = 0; index < 3; index++) {
new Promise(function (resolve, reject) {
setTimeout(function () {
console.log('Yo');
resolve();
}, 3000);
})
.then(function () {
console.log('What\'s up!');
});
}
}
hello();
所有3个承诺并行运行,使其在3秒后输出所有内容。如果要每3秒输出另一对日志,请查看其他答案。 :)
请确保您签出了caniuse这样的示例,以检查您要支持的浏览器是否支持Promises。