JavaScript异步解决方案之回调函数

192 阅读2分钟

异步概念

一个任务,不是连续完成的,可以理解该任务被人为分成两段,先执行一段,然后转而执行其他任务,等做好了准备,再回头来执行第二段。
比如:读取文件任务

  • 程序的第一段是想操作系统发送请求,要求读取哪个文件
  • 程序执行其他任务,等到操作系统返回文件,再接着执行任务的第二段,对读取到的文件内容做处理

回调函数

概念

  • JavaScript对于异步的实现,就是以回调函数的方式。
  • 回调函数,就是将把任务的第二段单独写在一个函数中,等到重新执行这个任务的时候(第一段任务完成),就调用这个函数。
  • Node规定:回调函数的参数第一个必须是错误对象 error
    • 异步操作分别两个阶段,第一阶段执行过程中遇到错误的时候,由于第一阶段的任务执行完毕之后对应的上下文环境已经结束了,第二阶段无法捕获到,只能通过参数的形式来传递错误。

代码

// 以回调函数的形式 实现读取文件
const fs = require('fs')


fs.readFile('./index1.html','utf-8',function(err,data){
    if(err) throw err
    console.log(data)
})

缺点: 回调地狱

  • 概念: 多个回调函数嵌套,下一个回调函数依赖于上个回调函数的执行结果
  • 原因: 人们习惯从上到下写代码,期望第一行发生的任何事情都会在第二行代码开始运行之前完成
  • 缺点:嵌套函数 之间存在强耦合性,很难处理每一个错误,代码庞大,难以维护。
  • 解决回调地狱:
    • 保持代码简短(通过函数名引用)
    • 模块化
    • 处理每一个错误