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

首頁 > 語言 > JavaScript > 正文

NodeJS實(shí)現(xiàn)同步的方法

2024-05-06 15:41:58
字體:
供稿:網(wǎng)友

NodeJS被打上了單線程、非阻塞、事件驅(qū)動…..等標(biāo)簽。

在單線程的情況下,是無法開啟子線程的。經(jīng)過了很久的研究,發(fā)現(xiàn)并沒有thread函數(shù)!!!但是有時候,我們確實(shí)需要“多線程”處理事務(wù)。nodeJS有兩個很基礎(chǔ)的api:setTimeout和setInterval。這兩個函數(shù)都能實(shí)現(xiàn)“異步”。

nodeJS的異步實(shí)現(xiàn):nodeJS有一個任務(wù)隊列,在使用setInterval函數(shù)的時候,會每隔特定的時間向該任務(wù)隊列增加任務(wù),從而實(shí)現(xiàn)“多任務(wù)”處理。但是,“特定的時間”不代表是具體的時間,也有可能是會大于我們設(shè)定的時間,也有可能小于。

我們跑跑下面代碼塊

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

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

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

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

問題來了,setInterval是能實(shí)現(xiàn)多任務(wù)的效果,但是怎樣才能實(shí)現(xiàn)任務(wù)之間的同步操作呢?這里實(shí)現(xiàn)的方法是通過回調(diào)函數(shù)實(shí)現(xiàn)的。

function a(callback) {  // 模擬任務(wù)a耗時  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);

這里舉了一個很簡單的例子,就是將b方法的實(shí)現(xiàn)賦值給a方法的callback函數(shù)從而實(shí)現(xiàn)函數(shù)回調(diào),但是會有個問題。假設(shè)a方法依賴于b方法,b方法依賴于c方法,c方法依賴于d方法…..也就意味著每個方法的實(shí)現(xiàn)都需要持有上一個方法的實(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ù)寫的多了,會造成代碼特別特別惡心。

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

$ npm instanll async

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

圖片精選

主站蜘蛛池模板: 土默特左旗| 台湾省| 文登市| 江北区| 茶陵县| 高要市| 容城县| 江陵县| 布尔津县| 东海县| 宜宾县| 山丹县| 平凉市| 玉溪市| 佛坪县| 杂多县| 岑溪市| 于都县| 吕梁市| 苍溪县| 溆浦县| 崇文区| 辽源市| 阿图什市| 巧家县| 昌吉市| 赣榆县| 肇东市| 双牌县| 龙川县| 密云县| 合阳县| 共和县| 济南市| 阜南县| 台东县| 福清市| 象州县| 阳谷县| 岑巩县| 拜泉县|