异步与同步

533 阅读2分钟

什么是异步?什么是同步?

如果能直接拿到结果,那就是同步;如果不能直接拿到结果,就是异步

举两个例子:

🌰 小A在医院排队挂号,只有在窗口拿到号才会离开。这个过程或许你会等三分钟,或许得要半个小时,总之不拿到号无法到达看医生的步骤。

这种不拿到结果不离开的情况叫同步

🌰 小B去人满为患的网红餐厅吃饭,被告知需要等位,此时小B拿完号可以去附近逛街购物,等快到号再回来就餐。

在等待的过程中可以进行别的事件,就称之为异步。此时,你可以选择每隔一段时间去餐厅询问一下排队进程(轮询),也可以微信扫码接收就餐通知(回调)。

以AJAX为例,request.send()之后,并不能直接得到response,必须等到readyState变为4后,浏览器request.onreadystatechange函数,我们才能得到request.response,这个过程与餐厅给你发送微信提醒是类似的。

回调 callback

💡 你写给自己用的函数不是回调,你写给他人调用的函数,就是回调。

request.onreadystatechange就是写给浏览器调用的函数。意为你(指浏览器)回头有时间调用一下这个函数。这里的“回头”,跟我们说的“回头请你吃个饭”的“回头”是一个意思。

回调举例:

function f1(){}
function f2(fn){
fn()
}
f2(f1)

分析:

  • 我调用了f1吗? 答:没有。
  • 我把f1传给别人(别的函数)了吗? 答:传了
  • f2调用f1了没有? 答:f2调用了f1
  • 那么,f1是不是我写给f2调用的函数? 答:是
  • 所以,f1是回调。

异步和回调的关系

  • 关联

异步任务需要在得到结果的时候通知JS来拿结果,过程就是让JS留一个函数地址给浏览器,当任务完成时浏览器调用该地址即可将结果作为参数传回。这个函数地址是写给浏览器调用的,所以称之为回调函数

  • 区别

异步任务需要用到回调函数来通知结果,但回调函数不只是用在异步任务里,也可用到同步任务。判断同步异步只需看这个函数的返回值有没有处于setTimeout,XMLHttpRequest,AddEventListener这三者其一的内部,如果有,就是异步。