setTimeout() 代码完成后同步执行代码的简单方法
Simple way to synchronously execute code after setTimout() code is done
我需要一种简单的方法来等待 setTimeout 代码完成执行,然后 运行 setTimeout 之后的代码。
现在包含 setTimout 的循环后代码在 loop/setTimout 完成执行之前执行。
for(let i = 0; i < 5; i++) {
setTimeout(function(){
console.log(i);
}, i*1000);
}
console.log("loop/timeout is done executing");
您可以定义一个函数并在超时内调用该函数
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");
}
setTimeout
根据定义不是同步的 - 无论您使用什么来解决问题都 必须 是异步的,没有办法解决这个问题。
实现类似目标的最佳方法是使用 Promise
s,在创建的承诺数组上调用 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
与主功能块的缩进级别相同,这可能是要走的路。
计数结束时需要 运行 的 code/message 需要在 for 循环内。这是实现此目的的简单方法。
for (let i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
if (i == 4) {
console.log("loop/timeout is done executing");
}
}, i * 1000);
}
我需要一种简单的方法来等待 setTimeout 代码完成执行,然后 运行 setTimeout 之后的代码。 现在包含 setTimout 的循环后代码在 loop/setTimout 完成执行之前执行。
for(let i = 0; i < 5; i++) {
setTimeout(function(){
console.log(i);
}, i*1000);
}
console.log("loop/timeout is done executing");
您可以定义一个函数并在超时内调用该函数
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");
}
setTimeout
根据定义不是同步的 - 无论您使用什么来解决问题都 必须 是异步的,没有办法解决这个问题。
实现类似目标的最佳方法是使用 Promise
s,在创建的承诺数组上调用 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
与主功能块的缩进级别相同,这可能是要走的路。
计数结束时需要 运行 的 code/message 需要在 for 循环内。这是实现此目的的简单方法。
for (let i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
if (i == 4) {
console.log("loop/timeout is done executing");
}
}, i * 1000);
}