node總結之回撥函數了解下
Node.js的非同步程式設計的直接體現就是回撥,其中,非同步程式設計依託於回撥來實現,但不能說使用了回撥後程序就非同步化了。回撥函式在完成任務後就會被呼叫,Node 使用了大量的回撥函式,Node 所有 API 都支援回撥函式。例如,我們可以一邊讀取檔案,一邊執行其他命令,在檔案讀取完成後,我們將檔案內容作為回撥函式的引數返回。這樣在執行程式碼時就沒有阻塞或等待檔案 I/O 操作,這就大大提高了 Node.js 的效能,可以處理大量的併發請求。
在node中,回撥函式一般作為函式的最後一個引數出現,如下:
function foo1(name, age, callback) { } function foo2(value, callback1, callback2) { }
我們來看下這個阻塞程式碼咋寫。
首先,建立一個檔案 input.txt ,內容如下:
luyaran is my love
再來建立 main.js 檔案, 程式碼如下:
var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("程式執行結束!");
執行結果如下:
$ node main.js
luyaran is my love
程式執行結束!
完事再來看非阻塞程式碼。
以上面的input.txt為基礎,再來建立 main.js 檔案, 程式碼如下:
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("程式執行結束!");
執行結果如下:
$ node main.js
程式執行結束!
luyaran is my love
通過以上兩個例項我們瞭解了阻塞與非阻塞呼叫的不同。第一個例項在檔案讀取完後才執行完程式。 第二個例項我們不需要等待檔案讀取完,這樣就可以在讀取檔案時同時執行接下來的程式碼,大大提高了程式的效能。因此,阻塞是按順序執行的,而非阻塞是不需要按順序的,所以如果需要處理回撥函式的引數,我們就需要寫在回撥函式內。
再來看下阻塞和非阻塞的區別:
1.阻塞:就像單執行緒cpu一樣,一個任務由多個小任務組成,但是隻能一個任務接一個任務流程的往想下走,誰在任務排序的前面就誰先執行,執行完了進行下一個,如果遇到錯誤,下面的小任務就不要做了,一直卡住。
2.非阻塞:就像多執行緒cpu一樣,一個任務由多個小任務組成,可以分開執行緒來做,哪個執行緒做分配到的任務,完成了對應的任務就行,某個執行緒的任務沒做完那就做報對應的錯,其他的不受影響。
阻塞和非阻塞,同步和非同步是node.js裡經常遇到的詞彙,我們舉個簡單的例子來說明。
我要看足球比賽,但是媽媽叫我燒水,電視機在客廳,燒水要在廚房。家裡有2個水壺,一個是普通的水壺,另一個是水開了會叫的那種水壺。我可以:
- 用普通的水壺燒,人在邊上看著,水開了再去看球。(同步,阻塞)這個是常規做法,但是我看球不爽了。
- 用普通水壺燒,人去看球,隔幾分鐘去廚房看看。(同步,非阻塞)這個又大問題,萬一在我離開的幾分鐘水開了,我就麻煩了。
- 用會叫的水壺,人在邊上看著。(非同步,阻塞)這個沒有問題,但是我太傻了。
- 用會叫的水壺,人去看球,聽見水壺叫了再去看。(非同步,非阻塞)這個應該是最好的。
等著看球的我:阻塞
看著電視的我:非阻塞
普通水壺:同步
會叫的水壺:非同步
所以,非同步往往配合非阻塞,才能發揮出威力。
通俗來說,同步就是你要做的事你列了一個清單,按照清單上的順序 一個一個執行,非同步就是可以同時幹好幾件事,阻塞就是按照清單上的順序一件一件的往下走,當一件事沒有做完,下面的事都幹不了,非阻塞就是這件事沒有幹完,後面的事不會等你這件事幹完了再幹,而是直接開始幹下一件事,等你這件事幹完了,後面的事也幹完了,這樣就大大提高了效率。
好啦,本次記錄就到這裡了。
如果感覺不錯的話,請多多點贊支援哦。。。