异步概念
一个任务,不是连续完成的,可以理解该任务被人为分成两段,先执行一段,然后转而执行其他任务,等做好了准备,再回头来执行第二段。
比如:读取文件任务
- 程序的第一段是想操作系统发送请求,要求读取哪个文件
- 程序执行其他任务,等到操作系统返回文件,再接着执行任务的第二段,对读取到的文件内容做处理
回调函数
概念
- JavaScript对于异步的实现,就是以回调函数的方式。
- 回调函数,就是将把任务的第二段单独写在一个函数中,等到重新执行这个任务的时候(第一段任务完成),就调用这个函数。
- Node规定:回调函数的参数第一个必须是错误对象 error
- 异步操作分别两个阶段,第一阶段执行过程中遇到错误的时候,由于第一阶段的任务执行完毕之后对应的上下文环境已经结束了,第二阶段无法捕获到,只能通过参数的形式来传递错误。
代码
// 以回调函数的形式 实现读取文件
const fs = require('fs')
fs.readFile('./index1.html','utf-8',function(err,data){
if(err) throw err
console.log(data)
})
缺点: 回调地狱
- 概念: 多个回调函数嵌套,下一个回调函数依赖于上个回调函数的执行结果
- 原因: 人们习惯从上到下写代码,期望第一行发生的任何事情都会在第二行代码开始运行之前完成
- 缺点:嵌套函数 之间存在强耦合性,很难处理每一个错误,代码庞大,难以维护。
- 解决回调地狱:
- 保持代码简短(通过函数名引用)
- 模块化
- 处理每一个错误