先说同步
只有忙完手头的任务,才能做下一个任务。这个过程叫同步。
异步
放下手头任务,去完成另一个任务,完成后,再回头做回手头这个任务。这个过程叫异步。
比如
setTimeout(()=>{
console.log("任务一")
},2000)
console.log("任务二")
当JS引擎执行到setTimeout,发现是个异步任务,则会把任务挂起,继续执行下一个任务。2秒后回调执行打印任务一。
为什么JS要使用异步
由于javascript是单线程的,在AJAX请求过程中,如果没有异步,就会出现用户长时间等待,并且由于当前任务并未完成,所以现在进行其他操作都会无响应。
异步和回调的关系
- 关联
- 异步任务需要在得到结果时通知JS来拿结果
- 怎么通知呢?
- 可以让JS写留一个函数地址(电话号码)给游览器
- 异步任务完成时游览器调用该函数地址即可(拨打电话)
- 同时把结果作为参数传给该函数(电话里说可以了)
- 这个函数是我写给游览器调用的,所以是回调函数
- 区别
- 异步任务需要用到回调函数来通知结果
- 但回调函数不一定只用在异步任务里
- 回调可以用到同步任务里
回调的两个结果
方法一:回调接受两个参数
fs.readFile('./1.txt',(error,data)=>{
if(error){console.log("失败"),return}
console.log(data.toString()) //成功
})
方法二:搞两个回调
ajax('get','/1.json',{
success:()=>{},fail:()=>{}
//接受一个对象,对象有两个key,表示成功和失败
})
两个回调有三个缺点
- 不规范,没有成文规定
- 很容易出现回调地狱,代码变得看不懂
- 很难进行错误处理