同步

通过一个现实中的例子来说一下同步:
假如你在医院挂号,你拿到号才会离开窗口
这种能直接拿到结果的就是同步

同步任务可能消耗 10 毫秒,也可能需要 3 秒
总之不拿到结果你是不会离开的

异步

假如你在餐厅门口等位,你拿到号可以去逛街
什么时候才能真正吃饭呢
你可以每 10 分钟去餐厅问一下(轮询)
你也可以扫码用微信接收通知(回调)
这种不能直接拿到结果的就是异步

以AJAX为例:
request.send() 之后,并不能直接得到 response
必须等到 readystate 変为 4 后,浏览器回头调用 request.onreadystatechange 函数
我们才能得到 request.response
这跟餐厅给你发送微信提醒的过程是类似的

回调 callback

你写给自己用的函数,不是回调
你写给别人用的函数,就是回调
request.Onreadystatechange 就是我写给浏览器调用的
意思就是你(浏览器)回头调一下这个函数

写了却不调用,给别人调用的函数,就是回调

异步和回调的关系

关联

异步任务需要在得到结果时通知 JS 来拿结果
怎么通知呢?

可以让 JS 留一个函数地址(电话号码)给浏览器
异步任务完成时浏览器调用该函数地址即可(拔打电话)
同时把结果作为参数传给该函数(电话里说可以来吃了)
这个函数是我写给浏览器调用的,所以是回调函数

区别

异步任务需要用到回调函数来通知结果
但回调函数不一定只用在异步任务里
回调可以用到同步任务里

array.foreach(n => console.log(n))就是同步回调
**

如何判断同步异步

如果一个函数的返回值处于:

  1. setTimeout
  2. AJAX (即 XMLHttpRequest)
  3. AddEventListener

这三个东西内部,那么这个函数就是异步函数

异步任务不能拿到结果
于是我们传一个回调给异步任务
异步任务完成时调用回调
调用的时候把结果作为参数

Promise

为啥要用Promise

其他方法都有问题
1.不规范,名称五花八门,有人用 success+error,有人用 success+fail,有人用 done+fail
2.容易出现回调地狱,代码变得看不懂
3.很难进行错误处理