Promise-上(异步or同步)

807 阅读3分钟

背景

异步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))
就是同步回调

回调的缺点

  • 不规范,名称五花八门
  • 很容易出现回调地狱,代码变得看不懂
  • 很难进行错误处理

怎么解决这三个问题?

  • 规范回调的名字或顺序
  • 拒绝回调地狱,让代码可读性更强
  • 很方便的捕获错误