《异步》

80 阅读2分钟

同步

  • 如果能直接拿到结果那就是同步
    比如你在医院挂号,你拿到号才会离开窗口
    同步任务可能消耗十毫秒 也可能需要三秒
    总之不拿到结果你是不可能离开的

异步

  • 如果不能直接拿到结果那就是异步
    比如你在餐厅门口等位,你拿到号可以去逛街
    什么时候才能真正吃饭呢
    你可以每十分钟去餐厅问一下(轮询) 你也可以扫码用微信接受通知(回调)
  • 举例
    异步举例
    以AJAX为例
    request.send()之后,并不能直接得到response
    不信console.log(request.response)试试
    必须等到readyState变为4后,浏览器回头调用request.onreadystatechange函数
    我们才能得到request.response
    这跟餐厅给你发送微信提醒的过程是类似的

回调callback

  • 写了却不调用 给别人调用的函数 就是回调
    你写给自己用的函数不是回调
    你写给别人用的函数就是回调
    request.onreadystatechange就是我写给浏览器调用的
    意思就是你(浏览器)回头调用一下
    在中文里 回头 也有 将来的意思 如 我回头请你吃饭
  • 举例
    把函数1给另一个函数2

**

function f1(){}
funciton f2(fn){
fn()
}
f2(f1)
  • 分析:
    我调用了f1吗 答:没有调用
    我把f1传给f2(别人)了吗 答 传了
    f2调用f1了吗 答:f2调用了f1
    那么 f1是不是我写给f2的调用函数 答 是
    所以 f1是回调

异步和回调的关系

  • 关联
    异步任务需要在得到结果时通知JS来拿结果
    怎么通知呢?
    可以让JS留一个函数地址(电话号码)给浏览器
    异步任务完成时浏览器调用该函数地址即可(拨打电话)
    同时把结果作为参数传递给该函数(电话里说可以来吃饭了)
    这个函数是我写给浏览器调用的 所以是回调函数
  • 区别
    异步任务需要用到回调函数来通知结果 也可以用轮询
    但回调函数不一定只用在异步任务里
    回调可以用到同步任务里
    array.forEach(n=)console。log(n))就是同步回调