国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

NodeJS如何實(shí)現(xiàn)同步的方法示例

2024-05-06 15:31:13
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

眾所周知,異步是得天獨(dú)厚的特點(diǎn)和優(yōu)勢(shì),但同時(shí)在程序中同步的需求(比如控制程序的執(zhí)行順序?yàn)椋篺unc1 -> func2 ->func3 )也是很常見(jiàn)的。

下面這篇文章主要介紹了關(guān)于NodeJS實(shí)現(xiàn)同步的相關(guān)內(nèi)容,NodeJS被打上了單線程、非阻塞、事件驅(qū)動(dòng)…..等標(biāo)簽。 在單線程的情況下,是無(wú)法開(kāi)啟子線程的。經(jīng)過(guò)了很久的研究,發(fā)現(xiàn)并沒(méi)有thread函數(shù)!!!但是有時(shí)候,我們確實(shí)需要“多線程”處理事務(wù)。nodeJS有兩個(gè)很基礎(chǔ)的api:setTimeout和setInterval。這兩個(gè)函數(shù)都能實(shí)現(xiàn)“異步”。 nodeJS的異步實(shí)現(xiàn):nodeJS有一個(gè)任務(wù)隊(duì)列,在使用setInterval函數(shù)的時(shí)候,會(huì)每隔特定的時(shí)間向該任務(wù)隊(duì)列增加任務(wù),從而實(shí)現(xiàn)“多任務(wù)”處理。但是,“特定的時(shí)間”不代表是具體的時(shí)間,也有可能是會(huì)大于我們?cè)O(shè)定的時(shí)間,也有可能小于。

我們跑跑下面代碼塊

setInterval(function() { console.log(new Date().getTime());}, 1000);

輸出的結(jié)果如下:

1490531390640
1490531391654
1490531392660
1490531393665
1490531394670
1490531395670
1490531396672
1490531397675
......

我們可以看到,所有的時(shí)間間隔都是不一樣的。時(shí)間的偏移不僅包含了間隔的1s,還包含了console.log()的耗時(shí),以及new Date()的耗時(shí)。在大量的數(shù)據(jù)統(tǒng)計(jì)下,時(shí)間間隔近似于1s。

問(wèn)題來(lái)了,setInterval是能實(shí)現(xiàn)多任務(wù)的效果,但是怎樣才能實(shí)現(xiàn)任務(wù)之間的同步操作呢?

這里實(shí)現(xiàn)的方法是通過(guò)回調(diào)函數(shù)實(shí)現(xiàn)的。

function a(callback) { // 模擬任務(wù)a耗時(shí) setTimeout(function() {  console.log("task a end!");  // 回調(diào)任務(wù)b  callback(); }, 3000);};function b() { setTimeout(function() {  console.log("task b end!"); }, 5000);}a(b);

這里舉了一個(gè)很簡(jiǎn)單的例子,就是將b方法的實(shí)現(xiàn)賦值給a方法的callback函數(shù)從而實(shí)現(xiàn)函數(shù)回調(diào),但是會(huì)有個(gè)問(wèn)題。假設(shè)a方法依賴于b方法,b方法依賴于c方法,c方法依賴于d方法…..也就意味著每個(gè)方法的實(shí)現(xiàn)都需要持有上一個(gè)方法的實(shí)例,從而實(shí)現(xiàn)回調(diào)。

function a(b, c, d) { console.log("hello a"); b(c, d);};function b(c, d) { console.log("hello b"); c(d);};function c(d) { console.log("hello c"); d()};function d() { console.log("hello d");};a(b, c, d);

輸出結(jié)果

hello a
hello b
hello c
hello d

如果回調(diào)函數(shù)寫(xiě)的多了,會(huì)造成代碼特別特別惡心。

如果有類似于sync的函數(shù)能讓任務(wù)順序執(zhí)行就更好了。終于找到了async這個(gè)庫(kù) $ npm instanll async

async = require("async");a = function (callback) { // 延遲5s模擬耗時(shí)操作 setTimeout(function () {  console.log("hello world a");  // 回調(diào)給下一個(gè)函數(shù)  callback(null, "function a"); }, 5000);};b = function (callback) { // 延遲1s模擬耗時(shí)操作 setTimeout(function () {  console.log("hello world b");  // 回調(diào)給下一個(gè)函數(shù)  callback(null, "function b"); }, 1000);};c = function (callback) { console.log("hello world c"); // 回調(diào)給下一個(gè)函數(shù) callback(null, "function c");};// 根據(jù)b, a, c這樣的順序執(zhí)行async.series([b, a, c], function (error, result) { console.log(result);});            
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 镇赉县| 松阳县| 从江县| 博客| 永兴县| 鄄城县| 浏阳市| 安塞县| 肃南| 祁阳县| 山西省| 芦山县| 峨边| 肇源县| 汕尾市| 临洮县| 孙吴县| 昭通市| 昌宁县| 重庆市| 凤冈县| 玉环县| 金寨县| 阳朔县| 乐业县| 永兴县| 克山县| 达尔| 合川市| 垣曲县| 安西县| 济南市| 青铜峡市| 肇州县| 文登市| 宁蒗| 琼结县| 墨玉县| 张家界市| 江津市| 宁陵县|