Page 41 - Node.js开发指南
P. 41

32  第 3 章  Node.js 快速入门


             Node.js 也提供了同步读取文件的 API:

                 //readfilesync.js

                 var fs = require('fs');
                 var data = fs.readFileSync('file.txt', 'utf-8');
                 console.log(data);
                 console.log('end.');
             运行的结果与前面不同,如下所示:

                 $ node readfilesync.js
                 Contents of the file.
                 end.
                 同步式读取文件的方式比较容易理解,将文件名作为参数传入 fs.readFileSync 函
             数,阻塞等待读取完成后,将文件的内容作为函数的返回值赋给 data 变量,接下来控制台
             输出 data 的值,最后输出 end.。
                 异步式读取文件就稍微有些违反直觉了,end.先被输出。要想理解结果,我们必须先
             知道在 Node.js 中,异步式 I/O 是通过回调函数来实现的。fs.readFile 接收了三个参数,
             第一个是文件名,第二个是编码方式,第三个是一个函数,我们称这个函数为回调函数。

             JavaScript  支持匿名的函数定义方式,譬如我们例子中回调函数的定义就是嵌套在
             fs.readFile 的参数表中的。这种定义方式在 JavaScript 程序中极为普遍,与下面这种定义
             方式实现的功能是一致的:

                 //readfilecallback.js

                 function readFileCallBack(err, data) {
                   if (err) {
                     console.error(err);
                   } else {
                     console.log(data);
                   }
                 }

                 var fs = require('fs');
                 fs.readFile('file.txt', 'utf-8', readFileCallBack);
                 console.log('end.');
                 fs.readFile 调用时所做的工作只是将异步式 I/O 请求发送给了操作系统,然后立即
             返回并执行后面的语句,执行完以后进入事件循环监听事件。当 fs 接收到 I/O 请求完成的
             事件时,事件循环会主动调用回调函数以完成后续工作。因此我们会先看到 end.,再看到
             file.txt 文件的内容。
   36   37   38   39   40   41   42   43   44   45   46