什么是异步?什么是同步?
- 能直接拿到结果,就是同步,比如医院挂号,拿到号才会离开窗口
- 不能直接拿到结果,就是异步,比如餐厅等位取号,拿到号后,可以去做别的事
可以每十分钟去餐厅问一下(轮询)
也可以扫码用微信接收通知(回调) - 异步的结果可以通过轮询获取,轮询就是定时去询问结果拿到了没有
- 也可以通过回调获取,一般来说结果会被作为回调的第一个参数
- 异步的好处是可以把用来等待的时间拿去做别的事情
什么是回调(callback)?
- 写了却不调用,给别人调用的函数就是回调
- 比如写一个函数 A,传给另一个函数 B 调用,那么函数 A 就是回调
- 回调可以用于同步任务,不一定非要用于异步任务
- array.forEach(n=> console.log(n))就是同步回调
- 有的时候回调还可以传给一个对象,如 request.onreadystatechange,等待浏览器来调用
异步和回调的关系
- 异步任务需要在得到结果时通知 JS 来拿结果
- 可以让 JS 写留一个函数地址给浏览器
- 异步任务完成时浏览器调用该函数地址即可
- 同时把结果作为参数传给该函数
- 这个函数是写给浏览器调用的,所以是回调函数
如何判断同步还是异步?
如果一个函数的返回值处于
- setTimeout
- AJAX (即 XMLHttpRequest)
- AddEventListener
这三个东西内部,那么这个函数就是异步函数
回调举例
function()摇骰子 {
setTimeout(() => {
return parseInt(Math.random() * 6) + 1
}, 1000)
// return undefined
}
- 摇骰子()没有写 return,那就是 return undefined
- 箭头函数里有 return,返回真正的结果
- 所以这是一个异步函数
const n = 摇骰子()
console.log(n) //undefined
如何获取函数结果?
- 可以用回调
- 写个函数,然后把函数地址给它
function f1(×) {console.log(x)}摇骰子(f1)
然后要求摇骰子函数得到结果后把结果作为参数传给 f1
function(fn) {
setTimeout(() => { //
fn(parseInt(Math.random() * 6) + 1)
}, 1000)
}
由于 f1 声明之后只用了一次,所以可以删掉 f1,简化为箭头函数
function f1(x) {console.log(x)}
摇骰子(f1)
改为
摇筛子(x => {
console.log(x)
})
再简化为
摇骰子(console.log)
总结
- 异步任务不能拿到结果
- 于是我们传一个回调给异步任务
- 异步任务完成时调用回调
- 调用的时候把结果作为参数
*本文为鲲游北冥的原创文章,著作权归本人和饥人谷所有,转载务必注明来源