什么是异步什么是同步
- 同步:如果能直接拿到结果就是同步
- 异步:不能直接拿到结果
异步举例
-
以AJAX为例
request.send()之后并不能直接得到response,必须等到readystate变为4之后,浏览器才会回头调用request.onreadystatechange函数。
-
回调callback
写给自己用的函数,不是回调,写给别人用的函数是回调。比如request.onreadystatechange就是我写给浏览器调用的函数。
异步和回调的关系
-
关联
异步任务需要在得到结果时通知js来取,这时我们可以给js留一个函数地址,异步任务完成时浏览器调用该函数地址,同时把结果作为参数传给该函数,这里的函数是我写给浏览器调用的,所以时回调函数。
-
区别
异步任务需要用到回调函数来通知结果 但回调函数不一定只用在异步任务里,也可以用到同步任务中 arr.forEach(n=>console.log(n)) 就是同步回调
判断同步异步
-
如果一个函数的返回值处于
1.setTimeout
2.AJAX(即XMLHttpRequest)
3.addEventListener 这三个值的内部就是异步函数。
注意:不要把AJAX设置成同步的,这样会使页面卡住
总结
- 异步任务不能拿到结果
- 于是传一个回调给异步任务
- 异步完成时调用回调
- 调用时把结果作为参数
promise(解决异步任务的两个结果:成功或失败)
解决异步任务的回调问题
- 规范回调的名字或顺序
- 拒绝回调地狱,让代码的可读性更高
- 很方便的捕获任务
以AJAX为例解释promise


总结
-
第一步
1.return new Promise((resolve,reject)=>{...})
2.任务成功调用resolve(result)
3.任务失败调用reject(onerror)
4.resolve和reject会再去调用成功和失败函数
-
第二步
使用.then(success,fail)传入成功和失败函数
封装AJAX的缺点
- .post无法上传数据(request.send可以上传)
- 不能设置请求头(request.setRequestHeader(key,value))
解决方法
-
jQuery.ajax
-
axios(目前最新的ajax库)
代码示例
优点:自动调用JSON.parse,请求拦截器;响应拦截器