17.Node.js 回调函数--异步编程

转自:http://www.runoob.com/nodejs/nodejs-tutorial.htmlhtml

Node.js 异步编程的直接体现就是回调。node

异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。编程

回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 全部 API 都支持回调函数。并发

例如,咱们能够一边读取文件,一边执行其余命令,在文件读取完成后,咱们将文件内容做为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操做。这就大大提升了 Node.js 的性能,能够处理大量的并发请求。异步

阻塞代码实例

建立一个文件 input.txt ,内容以下:异步编程

www.runoob.com

建立 main.js 文件, 代码以下:函数

 

var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log(data.toString()); console.log("程序执行结束!");

以上代码执行结果以下:性能

 

node main.js


非阻塞代码实例

建立一个文件 input.txt ,内容以下:ui

www.runoob.com

建立 main.js 文件, 代码以下:spa

var fs = require("fs"); fs.readFile('input.txt', function (err, data) { if (err) return console.error(err); console.log(data.toString()); }); console.log("程序执行结束!");

以上代码执行结果以下:

$ node main.js

以上两个实例咱们了解了阻塞与非阻塞调用的不一样。第一个实例在文件读取完后才执行完程序。 第二个实例咱们不须要等待文件读取完,这样就能够在读取文件时同时执行接下来的代码,大大提升了程序的性能。

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

 

 

在 Node 应用程序中,执行异步操做的函数将回调函数做为最后一个参数, 回调函数接收错误对象做为第一个参数。

接下来让咱们来从新看下前面的实例,建立一个 input.txt ,文件内容以下:

菜鸟教程官网地址:www.runoob.com

建立 main.js 文件,代码以下:

var fs = require("fs"); fs.readFile('input.txt', function (err, data) { if (err){ console.log(err.stack); return; } console.log(data.toString()); }); console.log("程序执行完毕");

以上程序中 fs.readFile() 是异步函数用于读取文件。 若是在读取文件过程当中发生错误,错误 err 对象就会输出错误信息。

若是没发生错误,readFile 跳过 err 对象的输出,文件内容就经过回调函数输出。

执行以上代码,执行结果以下:

程序执行完毕 菜鸟教程官网地址:www.runoob.com

接下来咱们删除 input.txt 文件,执行结果以下所示:

程序执行完毕 Error: ENOENT, open 'input.txt'

由于文件 input.txt 不存在,因此输出了错误信息。

相关文章
相关标签/搜索