JS進階之非阻塞


回調函數,阻塞和非阻塞對於初學者來說總是一些不好理解的東西,最好的辦法就是通過實際寫代碼去體會。筆者今天就通過一個例子來簡單解釋一下JS的非阻塞,分享分享我的理解。

首先回調函數:這是一個異步過程,簡單說就是,在一個函數的執行過程中,我去做我該做的事,在這期間我不管你,你可以去做你的事。但是當我做完我的事,之后,我就得通知你,接下來就看你的了。
比如:

function doSomething (callback) {
         //在這里你可以做你的事。
         callback("PengL"); 
    }
function callbackFunc(name)
{
    alert("I am "+name);
}
doSomething(callbackFunc);

這里就展現了一個基本的回調函數。

然后非阻塞:正是因為有了回調函數我們才能達到非阻塞的目的,非阻塞就是我在一刻不停得做事,一直不停下來。
我們來看個例子吧

console.log("程序時間:"+new Date().getTime());
setTimeout(function () {
	 console.log("暫停一秒:"+new Date().getTime());
}, 1000);
console.log('這是暫停一秒之后的時間:'+new Date().getTime());

從這里我們可以看到執行的順序是第一個console.log之后,遇到setTimeout,然后直接去執行第三個console.log,一秒后再來執行中間的那個。這個和java或者C#,C++都不一樣。這就是非阻塞,當遇到需要等待的時候,直接跳過,等這邊完了,再來執行。所以當我們在寫代碼時,就得注意一下這個特性,比如筆者最開始學的java面向對象編程,到了js這邊開始遇到這樣的問題還不知道怎么回事。
比如在c#中

console.writeLine("現在的時間"+DateTime.Now.ToString("HH:mm:ss"));
Thread.Sleep(1000);
console.writeLine("現在的時間"+DateTime.Now.ToString("HH:mm:ss"));

程序就會真的等一秒再執行下一步。這就是阻塞。

所以java,C#等語言是多線程的,而JS,nodejs都是單線程的。希望我這樣舉的例子,能給一些同學帶來幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM