Node.js 異步編程的直接體現(xiàn)就是回調(diào)坦喘。
異步編程依托于回調(diào)來實現(xiàn)盲再,但不能說使用了回調(diào)后程序就異步化了。
回調(diào)函數(shù)在完成任務(wù)后就會被調(diào)用瓣铣,Node 使用了大量的回調(diào)函數(shù)答朋,Node 所有 API 都支持回調(diào)函數(shù)。
例如棠笑,我們可以一邊讀取文件梦碗,一邊執(zhí)行其他命令,在文件讀取完成后,我們將文件內(nèi)容作為回調(diào)函數(shù)的參數(shù)返回洪规。這樣在執(zhí)行代碼時就沒有阻塞或等待文件 I/O 操作印屁。這就大大提高了 Node.js 的性能,可以處理大量的并發(fā)請求斩例。
阻塞代碼實例
創(chuàng)建一個文件 input.txt 雄人,內(nèi)容如下:
Twitch 正在學(xué)習(xí)Node.js!
創(chuàng)建main.js 文件,代碼如下:
var fs = require("fs");
var data = fs.readFileSync('input.txt'); // 讀取文件念赶,返回的文件內(nèi)容
console.log(data.toString());
console.log("程序執(zhí)行結(jié)束!");
以上代碼執(zhí)行效果如下:
非阻塞代碼實例
同樣讀取input.txt文件
創(chuàng)建 main_2.js 文件础钠,代碼如下:
var fs = require('fs'); // 引入操作文件系統(tǒng)模塊
// 讀取文件內(nèi)容,執(zhí)行回調(diào)叉谜,返回兩個參數(shù) err(錯誤信息)和 data 文件內(nèi)容
fs.readFile('input.txt',function(err,data){
if(err) return console.error(err);
console.log(data.toString()); // 沒有指定編碼方式旗吁,默認(rèn)返回原生buffer
});
console.log('程序執(zhí)行結(jié)束!');
以上代碼執(zhí)行結(jié)果如下:
以上兩個實例我們了解了阻塞與非阻塞調(diào)用的不同。第一個實例在文件讀取完后才執(zhí)行完程序停局。 第二個實例我們呢不需要等待文件讀取完很钓,這樣就可以在讀取文件時同時執(zhí)行接下來的代碼,大大提高了程序的性能董栽。
因此码倦,阻塞按是按順序執(zhí)行的,而非阻塞是不需要按順序的锭碳,所以如果需要處理回調(diào)函數(shù)的參數(shù)叹洲,我們就需要寫在回調(diào)函數(shù)內(nèi)。