#一. 前言
JS 是单线程的语言,所谓“单线程”,这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行 ,因此出现了异步
#二.什么是异步
console.log('a') ; setTimeout(function(){console.log('b');},2000); console.log('c')复制代码
以上一共三行代码,该程序被执行的时候,会依次挨行执行
第一步,执行第一行,将结果a打印出来 第二步,执行第二行,注意此时会将这个操作暂时存储到其他地方,因为setTimeout是一个异步执行操作。 第三步,执行第三行,将结果c打印出出来 第四步,等待最后一行程序(一共三行)都全部执行完了,然后立马实时查看刚才暂存的异步操作有没有。如果有可执行的,就立即拿到出来继续执行。 第五步,执行完毕之后,再实时查看暂存位置中是否还有未执行的异步回调。 所谓异步就是当代码执行的该位置时不在等待它执行完了在去执行下面的代码,而是存储到其他地方先执行下面的代码,从而解决了浏览器无响应(假死)的问题。#三.”异步模式”编程的几种方法:
(1)回调函数:优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),使得程序结构混乱、流程难以追踪(尤其是回调函数嵌套的情况),而且每个任务只能指定一个回调函数。
(2)采用事件驱动模式(事件监听):优点是比较容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以”去耦合“(Decoupling),有利于 实现模块化。缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰
(3)观察者模式:这种方法的性质与”事件监听”类似,但是明显优于后者。因为我们可以通过查看”消息中心”,了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行。
#四.浅谈观察者模式
最近刚好学了这个模式,就选择这个模式来谈谈,观察者模式比较概念的解释是,目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更新接口。具体观察者和具体目标继承各自的基类,然后具体观察者把自己注册到具体目标里,在具体目标发生变化时候,调度观察者的更新方法。
观察者模式实现代码(JavaScript版):
参考: