回调函数

1. 前置知识

在讲什么是回调函数之前,我们要对JavaScript的函数前置知识进行补充:

js的函数,可以是一种数据类型,又可以充当一个参数,甚至充当返回值

2. 什么是回调函数?

通俗来说就是可以将一个函数当作另一个函数的形参来传递。格式如下:

function A (形参1, 形参2, 函数B) {
    do something;
}

上面这是声明时的写法,你一定很好奇,那“函数B” 你说它是个函数,它什么方法都没有啊?

其实你可以先声明一个function 函数B ()这样子的,又可以在调用的时候才去实现这个方法。

function A (形参1, 形参2, 函数B) {    do something;}

A(传入形参1, 传入形参2, 函数B() {
  这里是函数B的实现方法体
  })

3. 回调函数有什么用?

那这样有什么作用呢?回调函数是NodeJs中异步编程很重要的一个知识。例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。

简单讲一下,什么是异步编程:

异步也就是多个事件不同时发生,如事件A要使用事件B的结果来进行下一步的操作时,事件A可以先执行前面的,然后等待事件B运行完拿到想要的数据再进行下一步操作。所以,事件A需要等待事件B。你可以这样理解,要等待的就是异步编程。这样可以让你快速有点头绪,其实也不全是这样……

举个简单的例子:

我要完成一个简单加法运算,但是有个条件:传入参数和最后运输返回是异步的

这个案例不难,等待就是异步,那加个setTimeout不就是等待了嘛

function add (x, y) {
    // 设置1秒后出计算结果
    console.log('开始运算')
    setTimeout (function () {
        // 保存计算结果
        console.log('保存计算结果')
        var result = x + y
        return result
    }, 1000)
    console.log('结束运算')
}

// 打印返回值结果
console.log('计算结果为:'+add(1, 2))
  • 运行一下

在这里插入图片描述

  • 结果分析

undefined ?为什么会是这个结果?

从执行顺序上来看我们就可以得出结论,

打印返回值结果 这一步并没有等待到 setTimeout 里面相加这步运行结束就已经打印结果了 ,所以返回结果为undefined。

我们要做的就是得到setTimeout里面的返回值。

我们来用callback函数改写一下上面的案例
function add (x, y, callback) {
    // 设置1秒后出计算结果
    console.log('开始运算')
    setTimeout (function () {
        // 保存计算结果
        console.log('保存计算结果')
        var result = x + y
        callback(result)
    }, 1000)

    console.log('结束运算')
}

add(1, 2, function (result) {
    // 这是callback函数实现体
    console.log('计算结果为:'+result)
})

这个函数的执行流程就是:传入x, y -> add跳过等待 -> add执行结束 ->setTimeout开始计算结果 -> 将计算结果当作callback函数的参数 -> callback函数实现体。

作用就是将异步的计算结果当作另一个函数的形参转发出去了。相当于你写多一个方法来保存这个计算结果。

  • 运行结果
    在这里插入图片描述

总结:

回调函数不难理解,你就把它当作一个形参来使用就好。多练习一下就可以了。不过,企业开发中不推荐使用callback函数,建议异步处理使用es6的"async" & “await”。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐