Node.js 12实战
上QQ阅读APP看书,第一时间看更新

2.5.2 阻塞和非阻塞

让我们先了解阻塞(Blocking)和非阻塞(Non-Blocking)的区别。阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

【示例2-5】看一个阻塞代码的示例。

首先创建一个文件input.txt,内容如下:

Hello Sync!

创建main1.js文件,代码如下:

var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("Done!");

以上代码执行结果如下:

node main.js
Hello Sync!
Done!

【示例2-6】再看一个非阻塞代码示例。

创建一个文件test1.txt,内容如下:

Hello Async!

创建main2.js文件,代码如下:

以上代码执行结果如下:

node main.js
Done!
Hello Async!

通过以上两个示例我们了解了阻塞与非阻塞调用的不同。第一个示例在文件读取完后才执行完程序。第二个示例我们不需要等待文件读取完,就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。

因此,阻塞是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,就需要写在回调函数内。