背景
异步or同步
同步:
同步的思想是:所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉)。这种情况下,用户不能关闭界面,如果关闭了,即迁移程序就中断了。
异步:
将用户请求放入消息队列,并反馈给用户,系统迁移程序已经启动,你可以关闭浏览器了。然后程序再慢慢地去写入数据库去。这就是异步。但是用户没有卡死的感觉,会告诉你,你的请求系统已经响应了。你可以关闭界面了。
异步举例:(以AJAX为例)
- request.send()之后,并不能直接得到response
- 必须等到readyState变为4以后,浏览器回头调用request.onreadystatechange函数
- 此时才能得到request.response
同步和异步本身是相对的
同步就相当于是 当客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。当服务端做完了才返回到客户端。这样的话客户端需要一直等待。用户使用起来会有不友好。
异步就是,当客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情,这样节约了时间,提高了效率。
存在就有其道理 异步虽然好 但是有些问题是要用同步用来解决,比如有些东西我们需要的是拿到返回的数据在进行操作的。这些是异步所无法解决的。
判断同步异步
如果一个函数的返回值处于
- setTimeout
- AJAX,即XMLHttprequest(不要把AJAX设置成同步,这会让页面在请求期间卡住)
- addEventListener
- 未完待续
的内部,那么这个函数就是异步函数
回调(callback)
- 写给别人用的函数
- 在中文里,【回头】也有将来的意思,如【我回头请你吃饭】
异步和回调的关系
关联
- 异步任务需要在得到结果是通知JS来拿结果
- 怎么通知?
- 可以让JS留一个函数地址(电话号码)给浏览器
- 异步任务完成时,浏览器调用该函数地址即可(拨打电话)
- 同时把结果作为参数传递给该函数(电话里说可以来吃了)
- 这个函数是写给浏览器调用的,所以是回调函数
区别
- 异步任务可以用回调函数通知结果,也可以通过轮询获取,轮询就是定时去询问结果拿到了没有。
- 但回调函数不一定只用在异步任务里
如:
array.forEach(n=>console.log(n))
就是同步回调
复制代码
回调的缺点
- 不规范,名称五花八门
- 很容易出现回调地狱,代码变得看不懂
- 很难进行错误处理
怎么解决这三个问题?
- 规范回调的名字或顺序
- 拒绝回调地狱,让代码可读性更强
- 很方便的捕获错误
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END