关于JS,特别是在nodejs中,异步编程的一些相关概念,总是零碎而不成体系的。网上找的资料,更只为增加这种印象。买了一本书《JavaScript异步编程--设计快速响应的网络应用》 ,初看时觉得大有裨益,里面涉及的东西比较全。可是再看下去,却觉得虽然不是零碎,但却是四分五裂的,因为总难领会其中的一以贯之的主旨------似乎主旨太多了;而作者更像是一个意气中的刀客,拿着刀在四面八方挥舞,每一刀下去,刀锋所过之处,都是倒下一片树------看上去很厉害的,但是我不知道他为什么要砍这么一刀。总之,这本书拿起又放下,放下又拿起,陆陆续续看过了有一年多。我尝试着慢读,或者集中火力重读,或者闲置不读后再读,只为最后那冲冠一怒一刻。但是距离我心中的豁然开朗总差那么一层------这种感觉估计就是猴急却无计可施。
最后,终于不是想象中的张三丰那般的突然一下豁然开朗,领悟行云流水之意;而是每次每次断断续续记录的片言支句,串联梳理,终于算明白了这本书的纲举目张。而功夫在书内的确实点到为止,功夫在书外的无穷无尽。但是,先将这书内的先整理了。
其实首先要搞清楚JS事件和实现模式的区别,实现js的异步事件的模式有3种:
JS的事件看上去是异步的,它主要体现在采用非阻塞的回调函数这种模式实现。这是js或nodejs内部用的一种模式。
发布订阅模式用来解决分布式的事件,例如EventEmitter
promise和deferred用来解决一次性事件的两种可能
前面三种是一个事件要解决的问题。如果多个事件要同时运行,它们可能或串行或并行或杂行,那就是事件工作流控制的范畴,例如async.js 或step
对于js而言,即便并行的多任务实际上也是单一一个线程实现的。那么js实际上可以用单线程处理所有问题,也就是说js并不存在多线程?
但是实际上还是有多进程的。只不过这些多进程是排除了资源共享冲突的多进程/多线程
以上就是这本书的脉络。
JS事件要实现异步需要考虑:
可以有多种模实现方法:
这每种模式都可以决定
但是复杂程度不一样
javascript采用的是单线程队列模式
异步的事件,触发时和接收时,不是占据全部CPU
JS就是基于事件循环的。有一个待执行事件队列;js顺序从事件队列中取事件开始执行。
什么时候往事件队列中添加可执行事件呢:
js代码是单线程执行的;但是js引擎内部是多线程执行的。
为了实现异步,或者脱胎于回调的执行,会导致很多上下文资源的累积浪费
改为基于消息循环进行事件实现,每个事件是
评论