编辑这个页面须要登录或更高权限!

Node.js 回调函数

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回调函数示例

以下是示例节点脚本,该示例脚本借助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嵌套回调函数示例

为了演示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回调函数中,我们学习了回调函数的执行流程以及它们如何实现非阻塞,以及如何将嵌套回调函数与示例结合使用。