Node.js的回调概念教程

108 阅读4分钟

Node.js回调概念

本文将介绍Node.js中异步函数的基础知识,以及如何使用回调来异步执行任务。回调相当于一个异步函数。异步函数也被称为非阻塞函数,因为它们不会阻塞运行在其上的线程。Node.js在很大程度上依赖于异步函数。

简介

这是因为服务器经常在同一时间收到许多请求;如果服务器是同步的,请求将被一个一个地处理,这将导致糟糕的用户体验,因为用户可能需要等待很长时间。

由于异步函数不会阻塞线程,因此可能很难跟踪该函数或在该函数执行完毕后立即做另一个任务。这就是回调的作用,回调函数是在异步函数中传递的函数,在函数之后立即运行。

前提条件

要跟随这篇文章,你将需要以下条件。

  • 你需要安装Node.js。
  • 你需要熟悉在Javascript中创建和执行函数。

让我们写代码吧

同步函数

让我们先看看同步代码是什么样子的。

创建一个名为input.txt的文件,内容如下。

Callbacks are functions that can be called immediately after completion of a task.

然后创建一个名为main.js的Javascript文件,在其中写下以下代码。

var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("Program Ended");

在上面的程序中,我们首先导入内置的文件系统模块。然后我们使用readFileSync 方法来读取我们先前创建的文件。

这个函数是同步的,因此会阻塞线程。在该函数完成对文件的读取之前,控制台不会输出结果。

通过这个命令运行程序。

$ node main.js

程序运行成功,并产生以下输出。

Output

如果该文件的数据量非常大,几乎需要一两分钟才能完成,怎么办?另外,我们可能需要做一些其他的任务,这些任务并不依赖于读文件函数的输出。

在这种情况下,等待函数完成读取并不是最好的解决办法。最好的办法是继续执行其他任务,并在函数完成计算后立即回来。

这就把我们带到了异步函数。

异步函数

如前所述,异步函数是不阻塞线程的函数。这意味着,在异步函数被调用后,Node.js运行时继续执行后面的其他语句。嚯!真棒,对吗?

这就带来了一种被称为并行的编程风格。这就是两个或多个任务同时执行,因此执行时间取决于运行时间最长的那个任务。

让我们看看一个异步函数的例子。

文件系统模块也给了我们一个异步函数来读取文件。然而,与同步版本不同,readFile ,不返回任何东西,所以我们不能存储结果。

让我们使用我们先前创建的文本文件。

用以下代码替换main.js文件中的代码。

var fs = require("fs");
fs.readFile('input.txt', () => {});
console.log("Program Ended");

再次运行该程序。

注意,尽管我们没有获得读文件函数的结果,但控制台还是打印出了程序结束。这是因为输出只能在回调函数中访问,而我们还没有实现。

现在让我们来谈谈回调。

回调函数

回调通常在有异步函数的时候使用。它们用于在异步函数执行完毕后立即执行任务。如果异步函数产生了一个结果,该结果将作为一个参数在回调上可用。

让我们来实现一个回调。

用下面的内容替换readFile 函数。

fs.readFile('input.txt', (err, data) => {
	if (err) return console.error(err)
	console.log(data.toString())
});

我们添加的回调函数接收两个参数,错误和数据。当文件被成功读取时,错误参数变为空。

因此,我们首先检查错误参数是否包含任何值。如果为真,回调函数返回并在控制台中打印出一个错误。否则,该函数将打印出文件的内容。

运行该代码。

你应该看到下面的情况。

Output

注意,在打印文件内容之前,程序打印了 "程序结束"。这是因为异步函数需要一些时间来完成,因此打印 "程序结束 "的下一条语句首先完成了执行。

一旦读取文件的函数完成了对文件的读取,回调函数就会被调用,必要的参数会被传递给它。

总结

在这篇文章中,我们已经经历了同步和异步函数。我们还看到如何使用回调函数在异步函数执行完毕后立即执行任务。回调函数给了我们一种跟踪异步函数进展的方法。

另一方面,异步函数给了我们一种并行执行任务的方法,从而最大限度地减少了执行时间。这个实习生使服务器运行更快,提供良好的用户体验。希望这能给你提供你需要的信息,让你开始工作。