- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > web開(kāi)發(fā) > JavaScript >
- JavaScript sleep睡眠函數的使用
JavaScript是單線(xiàn)程運行的,沒(méi)有內置的sleep函數,現在模擬實(shí)現sleep延遲執行的效果。
使用睡眠函數實(shí)現紅綠燈代碼,紅燈2秒,黃燈1秒,綠燈3秒,循環(huán)改變顏色。
直接使用setTimeout實(shí)現sleep()的方法,兼容性最好,但是使用了回調函數的實(shí)現方式,代碼的可讀性和維護性不是很好。
// setTimeout let fun = () => console.log('time out'); let sleep = function(fun,time){ setTimeout(()=>{ fun(); },time); } sleep(fun,2000); setTimeout setTimeout是最基本的實(shí)現方式,代碼如下,使用遞歸來(lái)實(shí)現循環(huán)改變顏色: function changeColor(color) { console.log('traffic-light ', color); } function main() { changeColor('red'); setTimeout(()=>{ changeColor('yellow'); setTimeout(() => { changeColor('green'); setTimeout(main, 2000); }, 1000); }, 2000); } main();
在ES6的語(yǔ)法中,Promise是sleep方法異步的實(shí)現一種方式,借助Promise方法可以?xún)?yōu)雅的構建sleep實(shí)現方法,避免了使用函數回調的使用方式。
// promise let fun = () => console.log('time out'); let sleep2= (time)=> new Promise((resolve)=>{ setTimeout(resolve,time) }) sleep2(2000).then(fun);
Promise
使用Promise,把下一次的顏色改變寫(xiě)在then里面,最后同樣使用遞歸完成循環(huán)。
使用promise代替setTimeout,利用鏈式調用以及then來(lái)實(shí)現燈的轉換,then返回一個(gè)promise對象,當這個(gè)對象為resolve狀態(tài)then可以持續調用。
const traffic_light=(color,duration)=>{ return new Promise((resolve,reject)=>{ console.log('traffic-light ', color); setTimeout(()=>{ resolve() },duration) }) } const main=()=>{ Promise.resolve() .then(()=>{ return traffic_light('red',3000) }) .then(()=>{ return traffic_light('yellow',1000) }) .then(()=>{ return traffic_light('green',2000) }) .then(()=>{ main(); }) } main()
async await實(shí)際上是generator和promise的語(yǔ)法糖,在提供同步編程方式實(shí)現異步調用的基礎上,同時(shí)滿(mǎn)足對sleep函數語(yǔ)義化的支持,也是常用的sleep的實(shí)現方式。
// async await async function wait(time){ await sleep2(time); fun(); } wait(3000);
async await 使用
使用async await就可以避免Promise的一連串.then.then.then,也不再需要遞歸,使用while(true)就可以實(shí)現循環(huán)。
function sleep(duration) { return new Promise(resolve => { setTimeout(resolve, duration); }) } async function changeColor(color, duration) { console.log('traffic-light ', color); await sleep(duration); } async function main() { while (true) { await changeColor('red', 2000); await changeColor('yellow', 1000); await changeColor('green', 3000); } } main();
const log = console.log; const sleep = (timeout) => { return new Promise((resolve)=>{ setTimeout(()=>{ resolve(); }, timeout) }) } const main = async()=>{ await sleep(1000); log(1); await sleep(2000); log(2); await sleep(3000); log(3); }
到此這篇關(guān)于JavaScript sleep睡眠函數的使用的文章就介紹到這了,更多相關(guān)JavaScript sleep睡眠函數內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站