[英]Simple way to synchronously execute code after setTimout() code is done
我需要一種簡單的方法來等待setTimeout代碼完成執行,然后運行setTimeout之后的代碼。 現在,包含setTimout的循環后代碼將在循環/ setTimout完成執行之前執行。
for(let i = 0; i < 5; i++) {
setTimeout(function(){
console.log(i);
}, i*1000);
}
console.log("loop/timeout is done executing");
setTimeout
根據定義不是同步的-用於解決問題的任何方法都必須是異步的,沒有辦法解決。
實現此類目標的最佳方法是改用Promise
,在創建的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,並且Promises不是同步的,但是如果您希望代碼看起來平坦,則可以使最終的console.log
與主功能塊處於相同的縮進級別,這可能是走。
您可以定義一個函數並在超時內調用該函數
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"); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.