Node.js回调函数:异步性是Node.js变得流行的基本因素之一。回调是函数异步的实现。一般来说,在 Node.js 中,大多数处理资源的函数都有回调变体。
当为某个任务调用某个异步函数的资源时,将立即让该控件继续执行该函数后面的后续语句。资源上的任务将并行启动。这可以帮助 Node.js 继续执行其他任务,而同时该函数正在使用该资源。一旦使用资源的任务完成,Node.js 将使用回调函数恢复。调用 Callback 函数时带有参数: 数据对象、结果对象和(或)包含任务相关信息的错误对象。
阻塞函数:与异步函数相反,同步函数将执行块,直到资源完成时才完成。 因此,同步函数也称为阻塞函数。
Node.js嵌套的回调函数 :如果对资源依次执行多个操作,并且还必须异步进行,则可以将回调函数彼此嵌套。
现在,在读取(任务)文件(资源)时,我们将看到回调函数与阻塞函数相比的三种情况。
Node.js阻塞函数示例
Node.js回调函数示例
Node.js嵌套回调函数示例
以下是一个示例节点脚本,该脚本同步读取sample.txt文件。
var fs = require('fs'); // 读取文件sample.txt var data = fs.readFileSync('sample.txt'); console.log("Reading file completed : " + new Date().toISOString()); console.log("After readFileSync statement : " + new Date().toISOString());
当上述程序运行时
终端输出
arjun@arjun-VPCEH26EN:~/nodejs$ node read-file-sync.js Reading file completed : 2017-10-19T12:21:40.103Z After readFileSync statement : 2017-10-19T12:21:40.105Z
after readFileSync 语句总是在完成读取文件后才执行。 fs.readFileSync 阻塞了执行流。
以下是示例节点脚本,该示例脚本借助Node.js回调函数异步读取sample.txt文件。
var fs = require('fs'); // 读取文件sample.txt fs.readFile('sample.txt', // 读取文件完成时调用的回调函数 function(err, data) { if (err) throw err; // 数据是包含文件内容的缓冲区 console.log("Reading file completed : " + new Date().toISOString()); }); console.log("After readFile asynchronously : " + new Date().toISOString());
当上述程序运行时
终端输出
arjun@arjun-VPCEH26EN:~/nodejs$ node read-file-async.js After readFile asynchronously : 2017-10-19T12:25:36.982Z Reading file completed : 2017-10-19T12:25:36.987Z
您可能会注意到,即使在执行 console.log 在 readFile 异步语句之后,完成对文件的读取也需要大约5毫秒。file. fs.readFile('sample.txt', callback function{..}) 没有阻塞执行,而是与主控制流并行启动一个新进程,以读取文件(对资源执行任务)。
为了演示Node.js嵌套回调函数,我们将考虑重命名文件然后使用异步函数将其删除的方案。
var fs = require('fs'); fs.rename('sample.txt', 'sample_old.txt', // 第一回叫功能 function (err) { if (err) throw err; console.log('File Renamed.'); fs.unlink('sample_old.txt', // 第二次回叫功能 function (err) { if (err) throw err; console.log('File Deleted.'); } ); } );
当上述Node.js示例与node一起运行时
终端输出
arjun@arjun-VPCEH26EN:~/nodejs$ node nodejs-nested-callback.js File Renamed. File Deleted.
在本Node.js教程– Node.js回调函数中,我们学习了回调函数的执行流程以及它们如何实现非阻塞,以及如何将嵌套回调函数与示例结合使用。