异步编程

异步编程 - 图1
语义JS某段源代码,不是按照顺序执行,而是在将来的某个时间,通过事件来触发执行。

  • 异步目的就是为了解决单线程的阻塞。
  • JS引擎是单线程的,但是浏览器的每一个页面的进程是多线程的。
  • 进程下的多个线程是可以共享数据的,话句话说就是有一块内存共享内存。

例子setTimeout函数:发送消息给浏览器线程启动时钟。时钟结束后,浏览器线程又发消息,被JS的消息队列接受,然后JS引擎执行setTimeout函数中的回调函数( 可以说是事件处理函数 )。

阻塞和非阻塞

语义关注点是程序的执行状态。程序调用的状态是挂起,还是继续执行。
例子浏览器的渲染主线程,在调用JS时,会挂起渲染主线程。在执行JS线程时,发起网络请求是非阻塞的。

异步和同步

语义在进程通信层面, 阻塞/非阻塞, 同步/异步基本是同义词

异步编程的需要解决问题

  • 异常捕获:异步代码里面的异常,无法使用try…catch…捕获。
  • 执行顺序:多个异步代码执行顺序的问题。
  • 竞态条件:JS在异步编程时,需要注意当异步事件回调同一块内存时,因为JS无法控制异步消息触发的时间,可能会出现意想不到的结果。
  • 回调地狱:异步代码相互依赖,一步步嵌套调用,导致异步代码的可读性非常差。