簡(jiǎn)短優(yōu)雅地利用js實(shí)現(xiàn) sleep 函數(shù)

簡(jiǎn)短優(yōu)雅地實(shí)現(xiàn) sleep 函數(shù)

很多語(yǔ)言都有 sleep 函數(shù),顯然 js 沒有,那么如何能簡(jiǎn)短優(yōu)雅地實(shí)現(xiàn)這個(gè)方法?

普通版

function sleep(sleepTime) {
    for(var start = new Date; new Date - start <= sleepTime;) {}
}
var t1 = +new Date()
sleep(3000)
var t2 = +new Date()
console.log(t2 - t1)

優(yōu)點(diǎn):簡(jiǎn)單粗暴,通俗易懂。

缺點(diǎn):這是最簡(jiǎn)單粗暴的實(shí)現(xiàn),確實(shí) sleep 了,也確實(shí)卡死了,CPU 會(huì)飆升,無(wú)論你的服務(wù)器 CPU 有多么 Niubility。

Promise 版本

function sleep(time) {
  return new Promise(resolve => setTimeout(resolve, time))
}

const t1 = +new Date()
sleep(3000).then(() => {
  const t2 = +new Date()
  console.log(t2 - t1)
})

優(yōu)點(diǎn):這種方式實(shí)際上是用了 setTimeout,沒有形成進(jìn)程阻塞,不會(huì)造成性能和負(fù)載問題。

缺點(diǎn):雖然不像 callback 套那么多層,但仍不怎么美觀,而且當(dāng)我們需要在某過程中需要停止執(zhí)行(或者在中途返回了錯(cuò)誤的值),還必須得層層判斷后跳出,非常麻煩,而且這種異步并不是那么徹底,還是看起來(lái)別扭

Async/Await 版本

function sleep(delay) {
  return new Promise(reslove => {
    setTimeout(reslove, delay)
  })
}

!async function test() {
  const t1 = +new Date()
  await sleep(3000)
  const t2 = +new Date()
  console.log(t2 - t1)
}()

缺點(diǎn): ES7 語(yǔ)法存在兼容性問題,有 babel 一切兼容性都不是問題

更優(yōu)雅的寫法

function sleep (time) {
  return new Promise((resolve) => setTimeout(resolve, time));
}

// 用法
sleep(500).then(() => {
    // 這里寫sleep之后需要去做的事情
})

不要忘了開源的力量

const sleep = require("sleep")

const t1 = +new Date()
sleep.msleep(3000)
const t2 = +new Date()
console.log(t2 - t1)

優(yōu)點(diǎn):能夠?qū)崿F(xiàn)更加精細(xì)的時(shí)間精確度,而且看起來(lái)就是真的 sleep 函數(shù),清晰直白。

缺點(diǎn):缺點(diǎn)需要安裝這個(gè)模塊,_,這也許算不上什么缺點(diǎn)。

綜上個(gè)人覺得合理的方案是Async/Await

從一個(gè)間簡(jiǎn)簡(jiǎn)單單的 sleep 函數(shù)我們就就可以管中窺豹,看見 JavaScript 近幾年來(lái)不斷快速的發(fā)展,不單單是異步編程這一塊,還有各種各樣的新技術(shù)和新框架,見證了 JavaScript 的繁榮。

你可能不知道的前端知識(shí)點(diǎn):Async/Await是目前前端異步書寫最優(yōu)雅的一種方式

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 有些東西很好用,但是你未必知道;有些東西你可能用過,但是你未必知道原理。 實(shí)現(xiàn)一個(gè)目的有多種途徑,俗話說,條條大路...
    微醺歲月閱讀 694評(píng)論 1 11
  • 前言 我們知道Javascript語(yǔ)言的執(zhí)行環(huán)境是"單線程"。也就是指一次只能完成一件任務(wù)。如果有多個(gè)任務(wù),就必須...
    浪里行舟閱讀 14,732評(píng)論 1 27
  • J3期第9組J8劉鳳平 踐行打卡記錄 時(shí)間:2019/06/03 億萬(wàn)富翁制造機(jī)練習(xí)分享 美女,早上好!我愛你...
    LFP_9a75閱讀 119評(píng)論 0 0
  • 這幾年學(xué)習(xí)的體會(huì)是 無(wú)論從事何種運(yùn)動(dòng) 學(xué)一下現(xiàn)代舞技術(shù) 尤其是即興 是大有裨益的 因?yàn)樗袆?dòng)作 不離呼吸開闔重心這...
    梁絳閱讀 790評(píng)論 1 2
  • 古圣教的成員主要分成三處集結(jié)地,其中黑袍男子他們這一處是最強(qiáng)的一處,已經(jīng)被東伯雪鷹解決。另外兩處就相對(duì)弱多了,連一...
    im喵小姐閱讀 191評(píng)論 0 0

友情鏈接更多精彩內(nèi)容