国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

JavaScript sleep睡眠函數的使用

發(fā)布時(shí)間:2021-08-17 12:16 來(lái)源: 閱讀:0 作者:進(jìn)擊的大羊 欄目: JavaScript 歡迎投稿:712375056

目錄

1.sleep函數

JavaScript是單線(xiàn)程運行的,沒(méi)有內置的sleep函數,現在模擬實(shí)現sleep延遲執行的效果。

使用睡眠函數實(shí)現紅綠燈代碼,紅燈2秒,黃燈1秒,綠燈3秒,循環(huán)改變顏色。

2. setTimeout

直接使用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();

3.Promise

在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()

4. async await

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();

5. 1s后輸出1 2s后輸出2 3s后輸出3

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í)歡迎投稿傳遞力量。

城中村快餐嫖老妇对白| 天堂资源中文最新版在线一区| 亚洲1区2区3区精华液| 波多野吉衣AV无码| 水蜜桃AV无码一区二区| 日本欧美大码A在线观看|