最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript實(shí)現(xiàn)sleep睡眠函數(shù)的幾種簡(jiǎn)單方法總結(jié)

 更新時(shí)間:2023年01月05日 11:24:14   作者:謝向晚  
sleep是一種函數(shù),他的作用是使程序暫停指定的時(shí)間,起到延時(shí)的效果,下面這篇文章主要給大家介紹了關(guān)于JavaScript實(shí)現(xiàn)sleep睡眠函數(shù)的幾種簡(jiǎn)單方法總結(jié),文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一.什么是sleep函數(shù)?

sleep是一種函數(shù),他的作用是使程序暫停指定的時(shí)間,起到延時(shí)的效果。

官方介紹:sleep是一種函數(shù),作用是延時(shí),程序暫停若干時(shí)間,在執(zhí)行時(shí)要拋出一個(gè)中斷異常,必須對(duì)其進(jìn)行捕獲并處理才可以使用這個(gè)函數(shù)。

例如:

console.log('1');
sleep(2000);
console.log('2');

控制臺(tái)輸出數(shù)字1后 會(huì)間隔2秒后輸出數(shù)字2

當(dāng)然上面的代碼是不能執(zhí)行的,因?yàn)閖s中是沒(méi)有sleep方法的。

所以這一篇文章主要介紹幾種在js中實(shí)現(xiàn)sleep的方式。

二.為什么使用sleep?

看到這里有人會(huì)問(wèn)了,為什么要使用sleep,上面的例子我可以使用setTimeout來(lái)實(shí)現(xiàn)???

因?yàn)閟etTimeout是通過(guò)回調(diào)函數(shù)來(lái)實(shí)現(xiàn)定時(shí)任務(wù)的,所以在多任務(wù)的場(chǎng)景下就會(huì)出現(xiàn)回調(diào)嵌套:

console.time('runTime:');
  setTimeout(() => {
    console.log('1');
    setTimeout(() => {
      console.log('2')
      setTimeout(() => {
        console.log('3')
        console.timeEnd('runTime:');
      }, 2000);
    }, 3000);
  }, 2000);
//結(jié)果:
//1
//2
//3
//runTime:: 7017.87890625 ms

上面的方式存在回調(diào)嵌套的問(wèn)題,我們希望可以利用sleep函數(shù)更方便優(yōu)雅地實(shí)現(xiàn)上面的例子。

三.實(shí)現(xiàn)sleep

接下來(lái)我們就分別用幾種不同的方法來(lái)實(shí)現(xiàn)下sleep方法:

基于Date實(shí)現(xiàn)

通過(guò)死循環(huán)來(lái)阻止代碼執(zhí)行,同時(shí)不停比對(duì)是否超時(shí)。

function sleep(time){
 var timeStamp = new Date().getTime();
 var endTime = timeStamp + time;
 while(true){
 if (new Date().getTime() > endTime){
  return;
 } 
 }
}
console.time('runTime:');
sleep(2000);
console.log('1');
sleep(3000);
console.log('2');
sleep(2000);
console.log('3');
console.timeEnd('runTime:');
// 1
// 2
// 3
// runTime:: 7004.301ms

缺點(diǎn):

以上的代碼不會(huì)讓線程休眠,而是通過(guò)高負(fù)荷計(jì)算使cpu無(wú)暇處理其他任務(wù)。

這樣做的缺點(diǎn)是在sleep的過(guò)程中其他所有的任務(wù)都會(huì)被暫停,包括dom的渲染。

所以sleep的過(guò)程中程序會(huì)處于假死狀態(tài),并不會(huì)去執(zhí)行其他任務(wù)

基于Promise的sleep

單純的Promise只是將之前的縱向嵌套改為了橫向嵌套:

function sleep(time){
 return new Promise(function(resolve){
 setTimeout(resolve, time);
 });
}
console.time('runTime:');
console.log('1');
sleep(1000).then(function(){
 console.log('2');
 sleep(2000).then(function(){
 console.log('3');
 console.timeEnd('runTime:');
 });
});
console.log('a');
// 1
// a
// 2
// 3
// runTime:: 3013.476ms

這其實(shí)和之前的setTimeout嵌套沒(méi)什么區(qū)別,也很難看。

我們?cè)俅芜M(jìn)行優(yōu)化,使用ES6的Generator函數(shù)來(lái)改寫上面的例子

基于Generator函數(shù)的sleep

我們對(duì)sleep的執(zhí)行使用Generator函數(shù)來(lái)執(zhí)行,并且搭配co來(lái)進(jìn)行自執(zhí)行。

var co = require('co');
 
function sleep(time){
 return new Promise(function(resolve){
 setTimeout(resolve, time);
 });
}
 
var run = function* (){
 console.time('runTime:');
 console.log('1');
 yield sleep(2000);
 console.log('2');
 yield sleep(1000);
 console.log('3'); 
 console.timeEnd('runTime:');
}
 
co(run);
console.log('a');
// 1
// a
// 2
// 3
// runTime:: 3004.935ms

可以看到整體的代碼看起來(lái)不存在嵌套的關(guān)系,并且執(zhí)行過(guò)程不會(huì)發(fā)生假死情況,不會(huì)阻塞其他任務(wù)的執(zhí)行。

但是多了一個(gè)co執(zhí)行器的引用,所以還是有瑕疵。

基于async函數(shù)的sleep

async函數(shù)最大的特點(diǎn)就是自帶執(zhí)行器,所以我們可以不借助co來(lái)實(shí)現(xiàn)sleep了

function sleep(time){
 return new Promise((resolve) => setTimeout(resolve, time));
}
 
async function run(){
 console.time('runTime:');
 console.log('1');
 await sleep(2000);
 console.log('2');
 await sleep(1000);
 console.log('3'); 
 console.timeEnd('runTime:');
}
 
run();
console.log('a');
 
// 1
// a
// 2
// 3
// runTime:: 3009.984ms

附:還有一種死循環(huán)寫法(參考自網(wǎng)絡(luò))

思路是利用系統(tǒng)時(shí)間,一旦沒(méi)有運(yùn)行到自己設(shè)定的時(shí)間就讓程序一直在循環(huán)里計(jì)算(個(gè)人感覺(jué)實(shí)現(xiàn)簡(jiǎn)單,實(shí)際運(yùn)行可能有點(diǎn)恐怖)

function sleep(numberMillis) { 
    //記錄當(dāng)前時(shí)間
    var now = new Date(); 
    //設(shè)置未來(lái)的某個(gè)時(shí)間
    var exitTime = now.getTime() + numberMillis; 
    while (true) { 
        //獲取當(dāng)前時(shí)間
        now = new Date(); 
        //檢查是否到了設(shè)置好的未來(lái)時(shí)間
        if (now.getTime() > exitTime) 
        return; 
    } 
}

總結(jié)

到此這篇關(guān)于JavaScript實(shí)現(xiàn)sleep睡眠函數(shù)的幾種簡(jiǎn)單方法總結(jié)的文章就介紹到這了,更多相關(guān)JS實(shí)現(xiàn)sleep睡眠函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 微信小程序如何獲取用戶頭像和昵稱

    微信小程序如何獲取用戶頭像和昵稱

    這篇文章主要介紹了微信小程序如何獲取用戶頭像和昵稱,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • js 求時(shí)間差的實(shí)現(xiàn)代碼

    js 求時(shí)間差的實(shí)現(xiàn)代碼

    下面小編就為大家?guī)?lái)一篇js 求時(shí)間差的實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家。也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-04-04
  • JavaScript XML操作 封裝類

    JavaScript XML操作 封裝類

    最近研究XML 用JavaScript寫了一個(gè)簡(jiǎn)單的XML讀取的操作類發(fā)給大家分享一下 可兼容 IE 火狐 Safari Chrome 6月30日下午 新修改了一下
    2009-07-07
  • JavaScript中數(shù)組flat方法的使用與實(shí)現(xiàn)方法

    JavaScript中數(shù)組flat方法的使用與實(shí)現(xiàn)方法

    在Array的顯示原型下有一個(gè)flat方法,可以將多維數(shù)組,降維,傳的參數(shù)是多少就降多少維,下面這篇文章主要給大家介紹了關(guān)于JavaScript中數(shù)組flat方法的使用與實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 深入探討JavaScript中Class的語(yǔ)法與使用

    深入探討JavaScript中Class的語(yǔ)法與使用

    這篇文章將帶大家深入探討 class 在 JavaScript 中的作用、語(yǔ)法和使用方法,并與 ES5 構(gòu)造函數(shù)進(jìn)行對(duì)比,希望可以幫助大家更好地理解和應(yīng)用類的概念
    2023-06-06
  • 微信小程序使用picker組件出現(xiàn)的問(wèn)題探究

    微信小程序使用picker組件出現(xiàn)的問(wèn)題探究

    這篇文章主要介紹了微信小程序自定義可搜索的picker組件,主要包括自定義可搜索的picker組件的代碼以及調(diào)用實(shí)例,這里的搜索框使用的是vant微信小程序組件庫(kù),picker使用的微信小程序的原生組件,需要的朋友可以參考下
    2023-01-01
  • javascript 命名空間以提高代碼重用性

    javascript 命名空間以提高代碼重用性

    為你封裝的javascript庫(kù)加上命名空間以提高代碼重用性
    2008-11-11
  • js插件設(shè)置innerHTML時(shí)在IE8下提示“未知運(yùn)行時(shí)錯(cuò)誤”解決方法

    js插件設(shè)置innerHTML時(shí)在IE8下提示“未知運(yùn)行時(shí)錯(cuò)誤”解決方法

    這篇文章主要介紹了js插件設(shè)置innerHTML時(shí)在IE8下提示“未知運(yùn)行時(shí)錯(cuò)誤”解決方法,較為詳細(xì)的分析了錯(cuò)誤的原因及對(duì)應(yīng)的解決方法,需要的朋友可以參考下
    2015-04-04
  • url傳遞的參數(shù)值中包含&時(shí),url自動(dòng)截?cái)鄦?wèn)題的解決方法

    url傳遞的參數(shù)值中包含&時(shí),url自動(dòng)截?cái)鄦?wèn)題的解決方法

    下面小編就為大家?guī)?lái)一篇url傳遞的參數(shù)值中包含&時(shí),url自動(dòng)截?cái)鄦?wèn)題的解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • Javascript模仿淘寶信用評(píng)價(jià)實(shí)例(附源碼)

    Javascript模仿淘寶信用評(píng)價(jià)實(shí)例(附源碼)

    這篇文章主要介紹了Javascript模仿淘寶信用評(píng)價(jià)功能實(shí)現(xiàn)方法,以完整實(shí)例形式分析了JavaScript響應(yīng)鼠標(biāo)事件動(dòng)態(tài)改變頁(yè)面元素的相關(guān)技巧,并附帶了完整的實(shí)例代碼供讀者下載參考,需要的朋友可以參考下
    2015-11-11

最新評(píng)論

平利县| 乐平市| 遵化市| 平利县| 沙坪坝区| 吉林市| 牟定县| 偏关县| 宁德市| 潼关县| 平顶山市| 沙田区| 竹山县| 安龙县| 古交市| 沈阳市| 周宁县| 华亭县| 四平市| 乌兰县| 合江县| 宜春市| 津南区| 澳门| 宣威市| 神池县| 崇州市| 仙游县| 灵宝市| 岑溪市| 泰兴市| 郑州市| 吐鲁番市| 聂拉木县| 通辽市| 永新县| 永昌县| 太和县| 遂溪县| 墨玉县| 平湖市|