NodeJS實現同步的方法

2022-03-27 16:09:15 字數 2972 閱讀 1149

nodejs被打上了單執行緒、非阻塞、事件驅動…..等標籤。 在單執行緒的情況下,是無法開啟子執行緒的。經過了很久的研究,發現並沒有thread函式!!!但是有時候,我們確實需要「多執行緒」處理事務。nodejs有兩個很基礎的api:settimeout和setinterval。這兩個函式都能實現「非同步」。 nodejs的非同步實現:nodejs有乙個任務佇列,在使用setinterval函式的時候,會每隔特定的時間向該任務佇列增加任務,從而實現「多工」處理。但是,「特定的時間」不代表是具體的時間,也有可能是會大於我們設定的時間,也有可能小於。 我們跑跑下面**塊

setinterval(function() , 1000);

輸出的結果如下:

1490531390640

1490531391654

1490531392660

1490531393665

1490531394670

1490531395670

1490531396672

1490531397675

......

我們可以看到,所有的時間間隔都是不一樣的。時間的偏移不僅包含了間隔的1s,還包含了console.log()的耗時,以及new date()的耗時。在大量的資料統計下,時間間隔近似於1s。

問題來了,setinterval是能實現多工的效果,但是怎樣才能實現任務之間的同步操作呢?這裡實現的方法是通過**函式實現的。

function a(callback) , 3000);

};function b() , 5000);

}a(b);

這裡舉了乙個很簡單的例子,就是將b方法的實現賦值給a方法的callback函式從而實現函式**,但是會有個問題。假設a方法依賴於b方法,b方法依賴於c方法,c方法依賴於d方法…..也就意味著每個方法的實現都需要持有上乙個方法的例項,從而實現**。

function a(b, c, d) ;

function b(c, d) ;

function c(d) ;

function d() ;

a(b, c, d);

輸出結果

hello a

hello b

hello c

hello d

如果**函式寫的多了,會造成**特別特別噁心。

如果有類似於sync的函式能讓任務順序執行就更好了。終於找到了async這個庫 $ npm instanll async

async = require("async");

a = function (callback) , 5000);

};b = function (callback) , 1000);

};c = function (callback) ;

// 根據b, a, c這樣的順序執行

async.series([b, a, c], function (error, result) );

注釋基本能夠很好的理解了,我們看看輸出

hello world b

hello world a

hello world c

[ 'function b', 'function a', 'function c' ]

其實nodejs基本api也提供了非同步實現同步的方式。基於promise+then的實現

sleep = function (time) , time);

});};console.log(sleep(3000));

輸出結果為:

promise 

end!

可以看出來,這裡返回了promise物件,直接輸出promise物件的時候,會輸出該物件的狀態,只有三種:pending、fulfilled、rejected。字面意思很好理解。也就是說promise有可能能實現我們非同步任務同步執行的功能。我們先用promise+then結合起來實現非同步任務同步操作。

sleep = function () , 1000);

}).then(function () , 2000);

}).then(function () )

};console.log(sleep(1000));

輸出結果:

promise 

start!

end!!

end!

在new promise任務執行完後,呼叫了resolve才會執行所有的then函式,並且這些then函式是非同步執行的。由輸出結果可以知道。(如果所有then是順序執行的應該是end! -> end!!)。但是上述也做到了兩個非同步任務之間順序執行了。

不過,還有更加優雅的方式:使用async+await。

display = function(time, string) , time)

});};// 執行順序:b a c

fn = async function () ();

輸出結果:

b

ac

由於這裡時間輸出比較尷尬,只能通過我們來感知,本人通過個人「感知」知道了在display b過度到display a的時候大概用了3s,再過度到display c的時候大概用了5s

nodeJS實現方法的同步效果(去非同步)

前言 nodejs最大的特點就是其非同步操作,其後邊方法的執行不會等到前邊方法執行完才去執行,而是同時執行好幾個方法,這種方式在給我們提高效率的同時也給開發多多少少帶來了不便,有時候我們不要求有這種效果的出現,這時候就需要進行去非同步操作。node的去非同步方式主要有三種 方法巢狀,遞迴呼叫,呼叫類...

nodejs實現同步http請求

nodejs實現同步http模組請求。用到http模組。在命令列呼叫node命令執行,可以這樣使用 let http require http 引入http模組 let co require co http模組傳送請求 param host param port param route param ...

nodejs實現同步操作想法實現

需要執行的函式 var func1 function req,res,callback 13000 var func2 function req,res,callback 5000 var func3 function req,res,callback 1000 可以看出在func1,func2和f...