我发现有些很基础的东西,看了就忘了,有必要记录一下,以防以后忘了再回来看看。
读取一个文件,然后打印出来
阻塞方式
var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("程序执行结束!");
输出
菜鸟教程官网地址:www.runoob.com
程序执行结束!
阻塞的方式就是我(readFileSync)今天不读完这个文件,你们谁都TM的不准动,所以如果这个文件读了5分钟,没办法后面的代码也得老老实实等着,那这样肯定是不行的,这个耗时的代码可以放一边执行,不要影响后面的代码。
非阻塞方式
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("程序执行结束!");
输出
程序执行结束!
菜鸟教程官网地址:www.runoob.com
这个就是我(console.log)先执行了,你(readFile)那么耗时间还不用CPU不是浪费吗?你就后面在运行把。
一个形象的比喻
阻塞和非阻塞,同步和异步是node.js里经常遇到的词汇,我举个简单的例子来说明:
我要看足球比赛,但是妈妈叫我烧水,电视机在客厅,烧水要在厨房。家里有2个水壶,一个是普通的水壶,另一个是水开了会叫的那种水壶。我可以:
- 用普通的水壶烧,人在边上看着,水开了再去看球。(
同步,阻塞
)这个是常规做法,但是我看球不爽了。- 用普通水壶烧,人去看球,隔几分钟去厨房看看。(
同步,非阻塞
)这个又大问题,万一在我离开的几分钟水开了,我就麻烦了。- 用会叫的水壶,人在边上看着。(
异步,阻塞
)这个没有问题,但是我太傻了。- 用会叫的水壶,人去看球,听见水壶叫了再去看。(
异步,非阻塞
)这个应该是最好的。
等着看球的我:阻塞
看着电视的我:非阻塞
普通水壶:同步
会叫的水壶:异步
所以,异步往往配合非阻塞,才能发挥出威力。
参考
Node.js 回调函数