异步
同步
- 能直接拿到结果
- 比如在医院挂号,拿到号才能离开窗口
- 拿到结果才能离开
异步
- 不能直接拿到结果
- 比如在餐厅等位,拿到号可以去逛街
- 轮询:可以每十分钟去餐厅问一下
- 回调:可以扫码用微信接到通知
回调和轮询都能拿到结果,不过形式不同
异步举例
ajax:
- request.send()之后,并不能直接得到request.response.
- 必须等到readyState变为4后,浏览器回头调用request.onreadystatechange函数
- 才能得到request.response
回调(callback)
- 写给自己的函数,不是回调
- 写给别人的函数,才是回调
- request.onreadystatechange是写给浏览器调用的
- 意思就是浏览器回头调用一下这个函数
- 写了却不调用,而是给别人调用的函数,就是回调函数
回调举例
- 把f1传给f2,f2调用了f1
- f1是回调函数
异步和回调的关联
- 异步任务要用回调方法把结果通知给刚才走了的js代码
- 异步任务需要在得到结果是通知js回来拿结果
- 让js留一个函数地址给浏览器
- 异步任务完成时浏览器调用该函数地址
- 同时把结果作为参数传给该函数
- 这个函数是写给浏览器调用的
- 所以是回调函数
异步和回调的区别
- 异步任务需要回调函数通知结果
- 但回调函数不一定只用在异步任务里
- 回调可以用在同步任务
- 例:array.forEach(n=>console.log(n))
判断异步函数
如果一个函数的返回值处于
-
setTimeout
-
AJAX(即XMLHttpRequest)
-
AddEventListener
就是回调函数
总结
- 异步任务不能拿到结果
- 于是我们传一个回调函数给异步任务
- 异步任务完成时,函数回调
- 调用的时候把结果作为参数
如果异步任务有成功和失败两个结果怎么办
- 方法一:
- 回调接受两个参数
- 方法二:
- 搞两个回调
两个方法的不足
- 不规范,名称五花八门
- 容易出现回调地狱,代码看不懂
- 很难进行错误处理
promise
- return new promise ((resolve,reject)=>{...})
- 任务成功时调用 resolve(result)
- 任务失败是调用 reject (error)
- resolvr和reject会再去调用成功和失败函数
- .then(success,fail)传入成功和失败函数
axios
目前最新的AJAX库
- 代码示例
- axios.get('./xxx').then(response=>console.log(response))