日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

javascript 使用sleep函數的常見方法詳解

瀏覽:37日期:2023-11-01 15:40:54

本文實例講述了javascript 使用sleep函數的常見方法。分享給大家供大家參考,具體如下:

一.什么是sleep函數?

花一點時間來聊一下sleep函數,首先什么是sleep函數?

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

例如:

console.log(’1’);sleep(5000);console.log(’2’);

控制臺輸出數字1后會間隔5秒后輸出數字2

當然上面的代碼是不能執行的,因為js中是沒有sleep方法的。

所以這一篇文章主要介紹幾種在js中實現sleep的方式。

二.為什么使用sleep?

看到這里有人會問了,為什么要使用sleep,上面的例子我可以使用setTimeout來實現啊?

因為setTimeout是通過回調函數來實現定時任務的,所以在多任務的場景下就會出現回調嵌套:

console.time(’runTime:’);setTimeout(function(){ console.log(’1’) setTimeout(function(){ console.log(’2’); setTimeout(function(){ console.log(’3’); console.timeEnd(’runTime:’); }, 2000); }, 3000);}, 2000);// 1// 2// 3// runTime:: 7013.104ms

上面的方式存在回調嵌套的問題,我們希望有一個優雅的方式來實現上面的例子:

sleep(2000);console.log(’1’);sleep(3000);console.log(’2’);sleep(2000);console.log(’3’);...

三.實現sleep

接下來我們就分別用幾種不同的方法來實現下sleep方法

1.基于Date實現

通過死循環來阻止代碼執行,同時不停比對是否超時。

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

缺點:

以上的代碼不會讓線程休眠,而是通過高負荷計算使cpu無暇處理其他任務。

這樣做的缺點是在sleep的過程中其他所有的任務都會被暫停,包括dom的渲染。

所以sleep的過程中程序會處于假死狀態,并不會去執行其他任務

2.基于Promise的sleep

為了解決ajax的回調嵌套問題,在jQuery1.8之后支持了Promise。但是單純的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

這其實和之前的setTimeout嵌套沒什么區別,也很難看。

我們再次進行優化,使用ES6的Generator函數來改寫上面的例子

3.基于Generator函數的sleep

我們對sleep的執行使用Generator函數來執行,并且搭配co來進行自執行。

看代碼:

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

可以看到整體的代碼看起來不存在嵌套的關系,還是比較舒服的。

并且執行過程不會發生假死情況,不會阻塞其他任務的執行。

但是多了一個co執行器的引用,所以還是有瑕疵。

當然這不是最終版,因為ES7為我們帶來了新的解決方案。

4.基于async函數的sleep

ES7新增了async函數,async函數最大的特點就是自帶執行器,所以我們可以不借助co來實現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

效果和之前的一樣。

5.使用child_process(子進程)實現sleep函數

前面介紹了幾種比較簡單的sleep實現,接下來看一個比較難的實現。

原理是將sleep放在子進程中執行,不會影響其他進程,看代碼:

var childProcess = require(’child_process’);var nodeBin = process.argv[0]; function sleep(time) { childProcess.execFileSync(nodeBin, [’-e’, ’setTimeout(function() {}, ’ + time + ’);’]); // childProcess.spawnSync(nodeBin, [’-e’, ’setTimeout(function() {}, ’ + time + ’);’]);} console.time(’runTime:’);console.log(’1’);sleep(1000);console.log(’2’);sleep(2000);console.log(’3’);console.timeEnd(’runTime:’); // 1// 2// 3// runTime:: 3579.093ms

以上代碼,是通過childProcess對象的execFileSync或者spawnSync創建一個同步進程,

在同步進程中執行定時器,定時器執行完畢后回收進程,程序繼續執行。

6.使用npm sleep包

前面的內容都是我們自己實現的,其實npm上已經有很多相關的js包了。

我們來看看他們是怎么實現的,sleep

var sleep = require(’sleep’); console.log(’1’);console.time(’runTime:’);sleep.sleep(2); //休眠2秒鐘console.log(’2’);sleep.msleep(1000); //休眠1000毫秒console.log(’3’);sleep.usleep(1000000) //休眠1000000微秒 = 1秒console.log(’4’);console.timeEnd(’runTime:’); // 1// 2// 3// 4// runTime:: 4014.455ms

很強有沒有,sleep包是C++編寫,然后擴展到Node來實現sleep函數也是一個不錯的選擇。

以上就是sleep的六種簡單實現。歡迎大家指出問題,我們一起進步。

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關于JavaScript相關內容可查看本站專題:《JavaScript常用函數技巧匯總》、《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》及《JavaScript數學運算用法總結》

希望本文所述對大家JavaScript程序設計有所幫助。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
中文字幕在线免费观看视频| 欧美精品羞羞答答| 久久高清免费观看| 日韩理论片av| 久久久成人网| 欧美.日韩.国产.一区.二区| 日韩精品免费一区二区三区| 高清不卡一区| 久久精品人人| 麻豆国产精品| 成人精品国产亚洲| 日韩中文影院| 亚洲国产专区校园欧美| av亚洲在线观看| 亚洲二区三区不卡| 在线视频日韩| 蜜桃91丨九色丨蝌蚪91桃色| 香蕉成人久久| 亚洲精品1区| 久久夜色精品| 日日摸夜夜添夜夜添国产精品| 日本不卡不码高清免费观看| 国产精品成人3p一区二区三区| 久久精品女人| 日韩国产欧美一区二区| 日本综合字幕| 黄页网站一区| 亚洲精品黄色| 国产精品亚洲产品| 成人在线视频区| 美女亚洲一区| 日韩中文字幕一区二区三区| 日本一区二区三区视频在线看| 香蕉久久一区| 美女视频黄久久| 999久久久91| 成人看片网站| 国产美女高潮在线| 色8久久久久| 美女在线视频一区| 日韩国产一区二区三区| 久久精品国产亚洲夜色av网站| 日韩中文在线电影| 亚洲最新无码中文字幕久久| 999久久久免费精品国产| 最新亚洲激情| 国产精品亚洲人成在99www| 婷婷成人基地| 日韩av成人高清| 视频一区在线播放| 青青草视频一区| 免费看欧美美女黄的网站| 极品日韩av| 中文字幕一区二区三区日韩精品| 日韩精品免费观看视频| 国产精品伦一区二区| 一本大道色婷婷在线| 蜜臀精品久久久久久蜜臀| 精品国产一级| 亚洲人www| 亚洲欧洲日韩精品在线| 免费在线日韩av| 国产91在线精品| 日韩理论视频| 日本99精品| 亚洲一级高清| 久久午夜影院| 天堂va在线高清一区| 日韩精品麻豆| 欧美国产中文高清| 亚洲五月综合| 亚洲特级毛片| 91一区二区| 国产三级一区| 激情久久五月| 国产毛片精品久久| 亚洲精品a级片| 国产日韩一区二区三区在线播放| 一区二区三区四区在线看| 亚洲精品影视| av资源中文在线| 亚洲免费一区三区| 新版的欧美在线视频| 一区二区自拍| 精品一区二区男人吃奶| 91久久黄色| 免费精品一区| 亚洲自啪免费| 国内精品麻豆美女在线播放视频| 中文日韩在线| 精品欧美视频| 99国产精品视频免费观看一公开| 91视频久久| 中文字幕亚洲在线观看| 高清日韩中文字幕| 视频精品一区| 亚洲高清不卡| 久久久久九九精品影院| 蜜桃传媒麻豆第一区在线观看| 国产一区二区三区视频在线| 一区二区不卡| 亚洲黄色中文字幕| 麻豆视频一区| 伊人国产精品| 另类中文字幕国产精品| 国产美女亚洲精品7777| 免费视频一区二区| 亚洲福利精品| 久久中文精品| 久久夜色精品| 久久久久久久久99精品大| 国产免费久久| 中文一区一区三区免费在线观| 日韩精品欧美| 国产精品三p一区二区| 日韩在线麻豆| 黄色在线一区| 久久国产免费| 国产 日韩 欧美 综合 一区| 国产欧美精品久久| 最新国产精品久久久| 欧美福利专区| 日韩大片在线播放| 精品视频网站| 国产精品久久久久久久久久白浆 | 久久蜜桃av| 国模精品一区| 国产精品亚洲四区在线观看 | 欧美日韩伊人| 亚洲精品免费观看| 亚洲精品午夜av福利久久蜜桃| 久久久男人天堂| 国产日韩一区二区三区在线播放| 日韩精品一级中文字幕精品视频免费观看 | 亚洲一区二区免费看| 日韩电影在线视频| 精品视频在线你懂得| 国产欧美一区二区三区米奇| 老司机精品久久| 黄色日韩在线| 欧美日韩激情| 激情五月综合网| 日本免费久久| 日本午夜精品久久久| 免费高清在线一区| 夜夜嗨一区二区| 午夜精品一区二区三区国产| 亚洲午夜视频| 亚洲韩日在线| 亚洲精品一二三区区别| 999国产精品视频| 欧美羞羞视频| 精品成人免费一区二区在线播放| 欧美国产极品| 精品国产aⅴ| 久久午夜影院| 国产精品13p| 久久久精品久久久久久96| 高清av一区| 欧美13videosex性极品| 少妇久久久久| 不卡视频在线| 激情综合亚洲| 国产亚洲在线观看| 亚洲一区二区三区高清不卡| 国产精品久久久久av电视剧| jiujiure精品视频播放| 视频在线观看国产精品| 综合激情婷婷| 日韩一区二区三区四区五区| 久久国产婷婷国产香蕉| 美女视频黄久久| 91亚洲国产成人久久精品| 高清av一区| av最新在线| 亚洲一区二区三区四区电影| 97精品资源在线观看| 欧美交a欧美精品喷水| 日韩88av| 欧美+日本+国产+在线a∨观看| 久久国产精品久久w女人spa| 欧美久久亚洲| 久久精品伊人| 一区在线观看| 日韩精品一区二区三区中文字幕| 日韩精品高清不卡| 久久精品一区二区国产| 伊人久久在线| 99久久夜色精品国产亚洲1000部| 丝袜a∨在线一区二区三区不卡| 日韩精品a在线观看91| 精品国产一区二| 亚洲成人三区| 亚洲精品乱码日韩| 免费视频一区二区三区在线观看| 一本一道久久a久久精品蜜桃| 日韩精品欧美成人高清一区二区| 精品午夜av| 99成人在线| 麻豆精品久久久|