登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mr.7

我将骄傲的活在这个大唐盛世

 
 
 

日志

 
 

js 异步编程的总结  

2015-01-26 16:26:34|  分类: 挨踢咋活 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

关于JS,特别是在nodejs中,异步编程的一些相关概念,总是零碎而不成体系的。网上找的资料,更只为增加这种印象。买了一本书《JavaScript异步编程--设计快速响应的网络应用》 ,初看时觉得大有裨益,里面涉及的东西比较全。可是再看下去,却觉得虽然不是零碎,但却是四分五裂的,因为总难领会其中的一以贯之的主旨------似乎主旨太多了;而作者更像是一个意气中的刀客,拿着刀在四面八方挥舞,每一刀下去,刀锋所过之处,都是倒下一片树------看上去很厉害的,但是我不知道他为什么要砍这么一刀。总之,这本书拿起又放下,放下又拿起,陆陆续续看过了有一年多。我尝试着慢读,或者集中火力重读,或者闲置不读后再读,只为最后那冲冠一怒一刻。但是距离我心中的豁然开朗总差那么一层------这种感觉估计就是猴急却无计可施。

最后,终于不是想象中的张三丰那般的突然一下豁然开朗,领悟行云流水之意;而是每次每次断断续续记录的片言支句,串联梳理,终于算明白了这本书的纲举目张。而功夫在书内的确实点到为止,功夫在书外的无穷无尽。但是,先将这书内的先整理了。

js 异步编程的总结 - Mr.7 - Mr.7

一.事件以及事件的实现模式

其实首先要搞清楚JS事件和实现模式的区别,实现js的异步事件的模式有3种:

  • 回调
  • 发布订阅
  • promise/deferred

JS的事件看上去是异步的,它主要体现在采用非阻塞的回调函数这种模式实现。这是js或nodejs内部用的一种模式。

  • 并非所有回调都是异步,有的回调就是同步
  • 并非所有的异步都是通过回调实现,这就是其他的设计模式,因为别的模式比这种模式更好

发布订阅模式用来解决分布式的事件,例如EventEmitter

promise和deferred用来解决一次性事件的两种可能


前面三种是一个事件要解决的问题。如果多个事件要同时运行,它们可能或串行或并行或杂行,那就是事件工作流控制的范畴,例如async.js 或step


对于js而言,即便并行的多任务实际上也是单一一个线程实现的。那么js实际上可以用单线程处理所有问题,也就是说js并不存在多线程?

但是实际上还是有多进程的。只不过这些多进程是排除了资源共享冲突的多进程/多线程


以上就是这本书的脉络。

二.JS事件实现机制

JS事件要实现异步需要考虑:

  • 什么时候开始?
  • 哪种方式(多线程/进程)

可以有多种模实现方法:

  • 多线程模式
  • 多进程模式
  • 单线程模式

这每种模式都可以决定

  • 何时开始,
  • 是否异步

但是复杂程度不一样

javascript采用的是单线程队列模式

  • 何时开始:当前主线程运行完毕后
  • 异步吗: 至少事件是异步的 或者说异步的是事件

异步的事件,触发时和接收时,不是占据全部CPU

  • 从触发的角度来看是异步的
  • 但是从整体的执行角度来看是同步的 消息队列

三.JS事件实现模型

JS就是基于事件循环的。有一个待执行事件队列;js顺序从事件队列中取事件开始执行。

什么时候往事件队列中添加可执行事件呢:

  • 鼠标键盘等io事件
  • 定时事件
  • 自定义的事件

js代码是单线程执行的;但是js引擎内部是多线程执行的。

为了实现异步,或者脱胎于回调的执行,会导致很多上下文资源的累积浪费

改为基于消息循环进行事件实现,每个事件是

  评论这张
 
阅读(500)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018