是否可以使用setTimout. 如果是,請分享您的想法:-
console.log("1st");
setTimeout(()=>{
console.log("2nd");
},0);
console.log("3rd");
**輸出應該是**
1st
2nd
3rd
uj5u.com熱心網友回復:
Majed Badawi 的回答顯示了一種實作您想要的方式的方法,但它只是一個類似于簡單地將您的第三個日志放在第二個之后的 setTimeout 回呼中的構造。
這有重要的概念原因。
JavaScript 是一種事件驅動的語言,其中你有一個稱為事件回圈的東西,它正在檢查新事件并不間斷地處理它們。
您在這里尋找的是一種在 PHP、C 或其他語言中setTimeout使用的方法。sleep它根本不存在。
sleep是一條阻塞指令:程式在繼續之前等待 X 秒。如果您在 JavaScript 中執行此操作,您將阻止事件回圈運行,您甚至不想嘗試執行此操作。如果你真的堅持,你可以檢查一個陳述句是否已經過了足夠的時間while,這將在前端環境中凍結你的瀏覽器或阻止在后端環境中處理新請求。
更多關于這里https://cloudoki.com/js-dont-block-the-event-loop/
相反,setTimeout一段時間后將向提供的偵聽器觸發一個事件,程式的其余部分(和事件回圈)將繼續運行。
uj5u.com熱心網友回復:
使用異步/等待:
const foo = () => new Promise(resolve => {
setTimeout(() => {
console.log("2nd");
resolve();
}, 0);
});
(async () => {
console.log("1st");
await foo();
console.log("3rd");
})();
uj5u.com熱心網友回復:
sleep不存在,但你可以自己制作??
function sleep(ms) {
return new Promise(r => setTimeout(r, ms))
}
async function main() {
console.log(1)
await sleep(1000)
console.log(2)
await sleep(1000)
console.log(3)
await sleep(1000)
return "done"
}
main().then(console.log, console.error)
思維async..await太神奇了?讓我們嘗試一個生成器 -
function sleep(ms) {
return Task(k => setTimeout(k, ms))
}
function* main() {
console.log(1)
yield sleep(1000)
console.log(2)
yield sleep(1000)
console.log(3)
yield sleep(1000)
return Task(k => k("done"))
}
function Task(runTask) {
return {
runTask,
bind: f => Task(k => runTask(x => f(x).runTask(k)))
}
}
function coroutine(f) {
function then(v) {
let {done, value} = f.next(v)
return done ? value : value.bind(then)
}
return then()
}
coroutine(main()).runTask(console.log)
發電機太復雜了?讓我們嘗試一個低級抽象 -
function sleep(ms, then) {
setTimeout(then, ms)
}
function main(then) {
console.log(1)
sleep(1000, _ => {
console.log(2)
sleep(1000, _ => {
console.log(3)
sleep(1000, _ => {
then("done")
})
})
})
}
main(console.log)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/477778.html
標籤:javascript json 异步 ecmascript-6 设置超时
上一篇:創建異步Task<T>而不運行
