回调函数

在谈论异步中的回调函数之前,我们有必要先学习一下函数是如何被传入到另一个函数中的。让我们通过一个简单的例子,来看看函数是如何和其他的JavaScript值一样,传入到函数中的:

var name = 'Tom';
hello(name);

上面的代码块中,我们定义了一个叫做name的变量,并且将一个字符串赋值给它。紧接着,我们将它做为参数传递给了hello函数。我们可以通过函数来做到同样的事情,我们先声明一个叫做name的函数,然后把它传递给hello

function name() {
  return 'Tom';
}
hello(name);

技术上说,name是一个回调函数,因为它被传入到了另外一个函数中。现在,我们来看看什么是异步操作中的回调函数。

在异步上下文中,回调函数就是一个普通的函数,只不过它会在异步逻辑结束时会被调用。按照约定,异步函数包含两个参数。第一个参数捕获错误,第二个参数捕获结果。一个回调函数可以是拥有名称,也可以是匿名的,但最好对它进行命名。让我们来看一个例子,通过 Node fs.readFile方法异步读取文件内容:

function handleReading(error, result) {
  console.log(result); 
}
fs.readFile('./my-file.txt', handleReading);

fs模块拥有一个叫做readFile的方法,它接收两个参数,第一个参数为文件路径,第二个参数为为回调函数。在上面的代码片段中,回调函数handleReading接收两个参数。第一个参数捕获潜在的错误,第二个参数接收结果。

下面是另外一个例子,通过https模块发出一个GET请求到远程服务器上:
code/callbacks/http-example.js

const https = require('https')
const url = 'https://jsonplaceholder.typicode.com/posts/1'
https.get(url, function(response) {
  response.setEncoding('utf-8')
  let body = ''
  response.on('data', d => {
    body += d
  })
  response.on('end', x => {
    console.log(body)
  })
})

当你调用get方法时,JavaScript会发出请求。当请求结果可用时,JavaScript就会调用我们的回调函数,并将请求结果交给我们。

用户头像
登录后发表评论