异步编程 - 图1

概述

  1. javaScript 采用单线程模式进行工作(避免线程同步的问题)
  2. 所谓”单线程”,就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。
  3. 异步编程用于处理耗时的操作时不至于阻塞
  4. 单线程好处:
    1. 实现起来比较简单,执行环境相对单纯
  5. 单线程坏处:

    1. 只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地 方,其他任务无法执行。

      同步模式

  6. 后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的

  7. 同步并不指的是同时执行,而是排队执行。
  8. 跟我们代码编写的顺序是完全一致的
  9. 一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。(阻塞)

    异步模式

  10. 每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。

  11. 耗时很长的操作都应该异步执行,避免浏览器失去响应
  12. 执行过如图

执行过程.jpg
执行过程描述
对于同步代码 先压栈 然后再执行 执行完成后弹栈,遇到异步方法如(setTimeOut)先压入栈,然后函数内部是异步调用,放入内部API环境中(如 web APIs)里进行计时 然后继续往后执行然后继续往下执行
当异步 结束时 放入消息队列 一旦消息队列发生变化 event loop 会监听到 然后会把消息队列中的第一个 压入调用栈 然后继续执行
总结
先执行完同步任务 再执行异步任务

回调函数

所有异步编程方案的根基
由调用者定义,交给执行者执行的函数
调用者告诉执行者异步任务结束后该做什么