我發(fā)現(xiàn)有些很基礎(chǔ)的東西,看了就忘了,有必要記錄一下,以防以后忘了再回來看看。
讀取一個文件,然后打印出來
阻塞方式
var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("程序執(zhí)行結(jié)束!");
輸出
菜鳥教程官網(wǎng)地址:www.runoob.com
程序執(zhí)行結(jié)束!
阻塞的方式就是我(readFileSync)今天不讀完這個文件,你們誰都TM的不準動,所以如果這個文件讀了5分鐘,沒辦法后面的代碼也得老老實實等著,那這樣肯定是不行的,這個耗時的代碼可以放一邊執(zhí)行,不要影響后面的代碼。
非阻塞方式
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("程序執(zhí)行結(jié)束!");
輸出
程序執(zhí)行結(jié)束!
菜鳥教程官網(wǎng)地址:www.runoob.com
這個就是我(console.log)先執(zhí)行了,你(readFile)那么耗時間還不用CPU不是浪費嗎?你就后面在運行把。
一個形象的比喻
阻塞和非阻塞,同步和異步是node.js里經(jīng)常遇到的詞匯,我舉個簡單的例子來說明:
我要看足球比賽,但是媽媽叫我燒水,電視機在客廳,燒水要在廚房。家里有2個水壺,一個是普通的水壺,另一個是水開了會叫的那種水壺。我可以:
- 用普通的水壺燒,人在邊上看著,水開了再去看球。(
同步,阻塞)這個是常規(guī)做法,但是我看球不爽了。- 用普通水壺燒,人去看球,隔幾分鐘去廚房看看。(
同步,非阻塞)這個又大問題,萬一在我離開的幾分鐘水開了,我就麻煩了。- 用會叫的水壺,人在邊上看著。(
異步,阻塞)這個沒有問題,但是我太傻了。- 用會叫的水壺,人去看球,聽見水壺叫了再去看。(
異步,非阻塞)這個應(yīng)該是最好的。
等著看球的我:阻塞
看著電視的我:非阻塞
普通水壺:同步
會叫的水壺:異步
所以,異步往往配合非阻塞,才能發(fā)揮出威力。