我需要一种简单的方法来等待setTimeout代码完成执行,然后运行setTimeout之后的代码。 现在,在loop / setTimout执行完毕之前,包含setTimout的循环代码正在执行。
for(let i = 0; i < 5; i++) {
setTimeout(function(){
console.log(i);
}, i*1000);
}
console.log("loop/timeout is done executing");
答案 0 :(得分:4)
setTimeout
不是同步的 - 无论你用什么来解决问题, 都是异步的,没有办法解决这个问题。
实现此类目标的最佳方法是使用Promise
代替,在创建的承诺数组上调用Promise.all
:
(async () => {
await Promise.all(Array.from(
{ length: 5 },
(_, i) => new Promise(res => setTimeout(() => {
console.log(i);
res();
}, i * 1000))
));
console.log("loop/timeout is done executing");
})();
虽然await
正在等待Promise,但Promise不是同步的,如果您希望代码看起来是平的,那么您可以使用console.log
与主要功能块相同的缩进级别,这可能是要走的路。
答案 1 :(得分:2)
你可以定义一个函数并在超时内调用该函数
let currentForId = 0;
for(let i = 0; i < 5; i++) {
setTimeout(function(){
console.log(i);
if(++currentForId == 5)
calling("message");
}, i*1000);
}
function calling(msg){
console.log(msg);
console.log("loop/timeout is done executing");
}