什么是回调?
回调是一个异步等效的功能。在完成特定任务回调函数被调用。 Node大量使用了回调。Node的所有的API都支持回调这样的一种方式。
例如,一个函数读取一个文件可能开始读取文件,并使得下一个指令可以被执行立即返回控制到执行环境。一旦文件I/O完成后,它会调用回调函数,同时传递回调函数,该文件的内容作为参数。因此,有没有堵塞或等待文件I/ O。这使得Node.js高度可扩展,因为它可以处理大量的请求,而无需等待任何函数来返回结果。
阻塞代码例子
创建一个名为input.txt的模块有以下内容的文本
I like the node
创建一个js文件名为main.js里面有如下代码:
var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("Program Ended");
现在运行main.js看到的结果:
$ node main.js
验证输出
I like the node
Program Ended
非阻塞代码例子
创建一个名为input.txt的文件有以下内容的文本
I like the node
更新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("Program Ended");
现在运行main.js看到的结果:
$ node test.js
验证输出
Program Ended
I like the node
这两个例子说明阻塞和非阻塞调用的概念。第一个例子说明程序块,直到它读取该文件,然后只前进到结束程序的地方。在第二个例子中,程序不等待文件读取,但它只是进行打印“Program Ended”,并同时程序无阻塞继续读取文件。
因此,阻挡程序执行在序列,从编程点查看其更容易实现的逻辑,但非阻塞方案并不按顺序执行,这样的情况下一个程序需要使用的任何数据进行处理,它应保持使用式相同的块,使之按顺序执行。