[Node.js]简化学习everyauth的异步流程控制

2012-10-22 评论(4) 分类:技术文章 Tags:

看了everyauth源码,第一次看解决异步流程问题的实现方法,感到很惊讶,为了更好地学习,实现了这个流程的简化版。

例子

先看看这段代码,功能是从本地文件读到一个url—请求这个url—把结果写入另一个文件。

var fs = require('fs'),
http = require('http');

fs.readFile('./url.txt', 'utf8', function (err,data) {
  http.get(data, function(res){
    var body = '';
    res.on('data', function(c){
      body += c;
    }).on('end', function(){
      fs.writeFile('./fetchResult', data + body, function(e) {
        if (e) console.log('error', e);
        else console.log('done');
      });
    });
  }).on('error', function(e){
    console.log(e);
  });
});

这段代码包括了三个步骤三个功能,但耦合在一起,可读性差,难以修改,对任意一部分修改或增加都要看完整坨代码才能找到,即时把每个callback都抽成一个变量,这一整个流程也是无法分离的。

改进版

对这种情况,everyauth使用了一种方法,可以把整个流程的实现代码写成这样:

engine
  .do('fetchHtml')
    .step('readUrl')
      .accepts('')
      .promises('url')
    .step('getHtml')
      .accepts('url')
      .promises('html')
    .step('saveHtml')
      .accepts('url html')
      .promises(null)

  .readUrl(function(){
    //read url from file
    ...
  })
  .getHtml(function(url){
    //send http request
    ...
  })
  .saveHtml(function(url, html){
    //save to file
    ...
  })

  .start('fetchHtml')

do是一串流水方法的开始,step指定每一个步骤对应的方法名,promises表示此步骤返回的变量名,accepts表示此步骤接受的参数(由前面step的方法提供的变量)。接下来是链式地实现每一个step的方法。

整个过程很清晰,程序的自我描述很好,把一段异步的流程按同步的方式写出来了。若要修改其中某个步骤,直接定位到某个步骤对应的方法就行,无需把整个流程的代码通读。若要增加步骤,也只需要在那些step流程上插入新的step然后实现具体方法,可以获取前面step提供的任何参数。

how it works

实现它用到四个对象:promise/step/sequence/engine

promise是基础,相信很多人熟悉它的概念,简单来说就是把多个callback放到一个promise对象里,在适当的地方通过这个对象调用这些callback。在这里的作用是:当step执行结束时,通知队列执行下一个step。具体地说就是把下一个step的函数保存到前一个step的promise里,前一个step完成任务时,带着数据回调下一个step进入执行。

step负责执行一个步骤,传入对应参数,并把执行结果(return值)按指定的promises名保存起来,以供下一个step使用。

sequence管理step链,让注册的step可以一步步往下执行。

engine是提供对外接口的对象,管理保存每一个do请求里的step和sequence,通过configurable配置自身的可动态添加的方法。

具体看代码:https://gist.github.com/3930621

(更多…)

2010

2010-12-31 评论(19) 分类:生活 Tags:

这是必须写的一篇博客,从07年起博客每一年的最后一片文章都是以年份为标题的总结文章,这样的一致性看起来还挺爽的,哈。这一年事情还挺多,回顾一下。

实习&学习

今年的两次实习对我的帮助非常大,让我一点点明白团队开发,项目运作是怎样的,在广研感受到软件工程的气息,在百度感受到linux的气息,两者给了我不一样的帮助,极大地开阔了我软件开发的视野。在这两个地方我都是做前端开发,但也不限于前端,身边的牛人都有个特点:都是hacker,知识范围广,对某几个领域深入研究,绝不会只限于前端/后端。

我一开始就把前端当主要学习领域去学习,计算机基础不太好,但软件开发的知识都是相通的,在工作的过程中再补基础知识也不晚。在技术水平不高,视野不够开阔的时候,每次参加一些技术分享/讨论会都有收获颇丰的感觉,要学的东西太多了,不断填补一些坑坑洼洼感觉也挺过瘾。非常感谢在两次实习过程中带给我帮助和启发的同事们~~

在学习上我最大的障碍还是英语水平,今年看英语文章比往年还更少了,水平也下降了,总是没法下恒心去背单词,导致没法上一层次,这是个大问题~

(更多…)

关于《什么是重要的》

2010-9-23 评论(13) 分类:随记 Tags:

先看看这篇文章,《什么是重要的》,大意就是说HTML5没什么了不起,不过是多几个API,搞这些只能给你虚荣水平没有提高,不如多去学学底层的图形学数据库等东西。

我在这篇文章留了言,不知为啥没通过审核,没显示出来,我大概说:这跟大学老师的说法是一样的,各人的学习方式不一样,应该自己选择怎样的学习方式。

确实这篇文章的论调跟大学老师是完全一样的,学好数据结构算法,学好底层编程,还怕学不会那些高层的东西?这是有道理的,而且这还是经验之谈,学编程到了一定阶段肯定会有这样的感悟,高层的语言没什么,重要的是底层的知识。但实际上这可能给你的学习指了一条艰难的道路。

“对于程序员,真正的核心竞争力是基本功。”这话显然没错,但还有更重要的,那就是兴趣。

没有兴趣的学习是痛苦的,有兴趣的学习往往是不痛苦甚至是快乐的。

我学习的第一门语言是AS,因为它可以很容易跟图形配合做出一个成品一个游戏。我为什么喜欢做前端技术,因为你可以看到用它做出来的与界面相结合的交互效果,看着自己做出来的东西感觉很爽,这是兴趣所在,我才能不断深入去学习。一开始就捣鼓能实现绚丽效果的语言并不代表以后都只停留在这一层面上,你会想为什么它能做到这样,jquery用多了你会去看它的源码,再去看看别的框架的源码,学习它的架构,最后去看浏览器的源码,层层向下深入理解,这个过程是兴趣驱动的。

而如果是自底向上的学习就不一样了,在实验室里用C++编出来的控制台里对一个数组排序,或者输出一个日历,这样的东西恐怕难以让人提起兴趣。我就是因为这样一直对C++不怀好感,但是最近我开始在补C++的知识,因为我看到chrome这么快这么爽,有兴趣去了解它的实现。

当然各人的兴趣是不一样的,有人更愿意从底层开始学起,这样感觉踏实。看过一些所谓“忠告”会说大学期间不要去接触那些太高层的语言,学好那些基础课程才最重要,甚至连JAVA的那些框架都不要去碰,这个忠告有点傻,自底向上的学习和自顶向下的学习方式都是没问题的,看个人喜好去选择。其实我之前写的《关于学习》已经写得够多了,不再重复了。

所以捣鼓HTML5这些新东西是没问题的,它绚丽的效果会提升你深入了解相关知识的兴趣。只要你不完全停留在“顶”上,捣鼓那些新技术捣鼓了几年都还停留在那个层面,就完全没有问题。

P.S 其实很多新演示产生绚丽效果的是CSS3,跟HTML5没啥关系,不过把HTML5当HTML5和CSS3这一代的统称也没啥问题~

关于学习

2010-2-19 评论(12) 分类:随记 Tags:

当初上《数字电路》和《计算机组成原理》这些课程的时候,非常痛苦,很难看进去,很抗拒这些知识,我以为是我天生讨厌硬件的缘故。最近看了《编码的奥秘》(udonmai 指出是《CODE》,最近的出版物是《编码:隐匿在计算机软硬件背后的语言 (平装)》),发现实际上不是,这本书从最初的手电筒传信息开始,一步一步介绍通信和编码的演变,最终把构造一台计算机的来龙去脉都一一介绍完毕,包括了上面提到的《数字电路》和《计算机组成原理》的知识,操作系统与汇编也有所提及。我可以像看小说一样无痛苦地吸收这些知识,甚至看到有点兴奋,原来十进制没什么特别,原来逻辑门是这样发展而来的,原来RAM是这样来的。相反学习那两门课程时异常痛苦,一开始就是专业知识,三态门晶体管什么的,鬼知道这些是什么东西,基本上这些课程是要“啃”下来的,我这两门课都考80多分了,结果基本上都是应付考试,考完没留下多少东西在大脑里,看《编码的奥秘》时很多知识点回想起来才恍然大悟,不知应该说这本书太好,还是课程太烂。

计算机很多基础课程学生们普遍看法是:学这些有什么用?普遍的回答是:以后你就知道有什么用了。另外就软件专业来说,在学校学的都是基础课程,不会教应用层这么“肤浅”的东西,即时毕业出去后做的都是应用层的东西,因为你懂了这些底层的知识,才能更好地学习这些应用层的东西,并且也更容易学习,否则只学一些皮毛就跟职业学校的学生没什么区别了。这应该是对的,但就我个人感觉而言,要是不知道这东西用来干嘛,那学起来真是痛苦,相信挺多人有同感。

很多人都喜欢打一个比喻,像盖房子一样,先得把地基打扎实了,建高楼才不会倒。听起来真是很有道理,但我觉得并不正确,建楼房地基打完后是没得改的,要改得把楼房全铲平才行,一定得按自底向上的方式盖楼。而学习不一样,随时可以去补充下层知识,并且不会因此付出什么代价,反而带着目的去补充下层的知识,效率更高,学习过程的痛苦也相对会少。计算机的更是这样,上层下层都有很多共同之处,先学上层应用层,再在有兴趣或有必要的时候回过去学习下层也是一种不错的选择,至少对我来说是挺好的。国内教育基本不会考虑“兴趣”这回事,当然大学把计算机作为一门科学技术当然不能这么搞,还是得规规矩矩一步一步来,但个人还是可以选择适合自己的方法。

我觉得如果我不是事先学了一些应用层的东西,直接去学大学那些课程,不知会不会因为太枯燥而学得太痛苦甚至转行。实际上我学的第一门计算机语言是Actionscript2,学的时候不知道,现在觉得它真是极佳的入门语言,首先它很容易,第二它跟C++/JAVA等主流语言风格差不多,第三它是FLASH的语言,很容易可以做出一些有趣的东西。第三点是最重要的,能给人学下去的动力,学的过程也不枯燥。像大学课程学的语言C++,对我来说就太枯燥了,学了那么久能用它干什么?无非就是在丑陋的控制台输出乘法表,输出日历什么的,实在是让人提不起兴趣。在快乐地学一点AS2后再去学C++能相对容易一些,也不会那么枯燥。

应该所有知识都可以是很有趣的,甚至包括马克思主义、毛邓三这些,只是课程把他们变枯燥了,甚至把感兴趣的人往门外推,尽可能通过某种方式提升对这些知识的兴趣,把它们变得有趣点学起来比较爽,真希望多点《编码的奥秘》这样的书,我觉得未来应该会提倡无痛苦的学习方式,不过那应该是很遥远的未来。

兼职结束

2009-12-20 评论(1) 分类:生活 Tags:

上个星期12月13日正式结束了我的一份兼职工作,3月6日-12月13日,历时九个月。

在大二寒假快结束的时候,我突然想在网上找找看有没有项目有没有兼职可以做,结果就找到了这份兼职,最初是给我一个星期的时间去学习prado框架和做一个应用—抓取5tutor.com上的数据保存到数据库,要求程序要用prado这个框架做。当时学起来难度有点大,prado这个框架挺冷门的,资料很少,官网文档都不怎么齐全,最后我还是做到了,估计也超出他的预期了,兼职就正式开始了,当晚通了个电话,聊了点相关事宜,那时还挺激动的,毕竟是第一份拿工资的工作。对方是香港人,他的普通话跟我的粤语一个水平,结果挺搞,不知道用粤语好还是普通话好。

这个开始的入门程序做了二三十个小时,但他说以后会要求我用6-7小时甚至更少的时间要我完成这样的程序,事实上,后来,根本不是这回事。刚开始的时候要求很高,要我在一个周末两天内做出一个挺难的组件,当时实在是做不到,搞到我想要是这么辛苦的话,不做算了,但到后来似乎工作量越来越少,他要求也变低了很多,万事开头难啊,在开头几个星期里很辛苦,熬过去后,后面很轻松,总的来说,这份兼职做得挺轻松的。

刚开始那一个月要求高一点,沟通上也不怎么顺畅,一次舍友生日,我跟他说,今晚舍友生日,那些工作我明天再做吧,当时他回我什么我忘了,反正看了很不爽。后来似乎态度好了,沟通也顺畅了,因为他本身也是程序员,还挺厉害的,说到一些程序问题不会出现鸡同鸭讲的情况。另外他不仅仅是要我完成他的程序,还有意让我学多点东西,碰到我有疑问的会讲跟我讲一大堆,像个导师栽培学生~还会让我尝试新的东西。有时候我偷懒也不会怎么责怪,到现在只有跟我提过一次说最近我做得太慢了,thx、sorry这样的词也对我也说了不少次。觉得这样的老板是挺难得的。在此感谢他~

忘了说,他是做香港家教中介网站的,叫“香港导师街”,我做的都是后台管理的,所以在网站上都看不到~现在的主页外观本来也算是我做的,但他只单单把导航栏部分抽出来放上去了。

起初他对我说停止合作的时候,我还觉得是不是因为我偷懒了所以被炒了,回复说绝对不是,他已经付出很多时间做training,炒掉我对他也是挺大的损失,纯粹是业务发展上的原因。“如果可以的話, 我必與你合作.”相信他说的是真的,因为确实对我的学习投入了不少。可能他网站完善了,不再需要雇人了吧。

有这份兼职,有稳定的生活费,就能安心学习,安心做我自己喜欢做的东西了,其他项目做不做都行。现在没了这份兼职,可能得花多点时间在做网站做页面赚钱上了,sigh~

又是一篇没主题的日志

2009-4-30 评论(0) 分类:生活 Tags:

除了做PHP的兼职,最近似乎又回到无所事事的状态了,在网上看看博客,看看教程,在当当网买了本书,《ajax设计模式与最佳实践》,三天了还没到,这本书电脑里有英文版,但太晦涩了,看它讲的内容我也不懂,就买了。很多javascript、php的书来来去去讲的都是那些,基本上都没什么用,入门靠书,提高应该就是靠实践了。

我之前想,专注学习php和javascript,以后找工作就找跟这两个有关的职位,专才能精,精才能找到工作,最近发现这个想法并不怎么正确,JAVA这航空母舰,还是有必要了解它的,怎么说也是学计算机的,总不能停留在应用层,底层的一些原理有必要了解,也有兴趣去了解。但底层到像《计算机组成原理》那样,我就没兴趣去了解了。

这学期的课程虽然多又重要,但似乎上的课一学期比一学期少,班里大部分人也没什么激情去上课了,相当颓,花费在课程上的时间应该不到1/5,包括上课的时间。

刚开学时就跟一个人在说做一个小型服装系统的事,我写了分粗略的计划给他,三四个星期前他来华师跟我面谈了,来了才知道他是以前教信的师兄,本以为人都来了,这个项目就确定做了,前一两个星期也想好了数据库,打算用ThinkPHP框架做,顺便学下MVC模式,不料原来他们公司还找了其他几个团队同样写系统策划,谁好谁便宜就叫谁做,让我改好策划方案给他。嗯,前两天交给他了,但这个项目接手的希望不大。

对这个服装系统花了挺多时间的,数据库的设计想了很久,主要是储存编码和编码的属性,要根据编码提取出相关的属性,最后想出来了,在脑袋中是可以运行,实际会碰到什么问题就不知道了,还没进行实践。其他如尝试ThinkPHP,了解需求,写策划都花了不少时间,我觉得就算接不了项目,这些时间花得还是值得的。那次他来华师聊了一点企业相关的事情,对我还是有挺大影响的,至少视野应该扩大了一点点,不会整天闷在一堆代码里。了解用户需求、写软件策划书,都是第一次,虽然写得并不正式,但自我感觉还是不错的。

各人有各人的烦恼,就算我现在活得很好,有时还是会有些小烦恼,甚至会迷茫,要干啥呀。不知道。

多久没有好好看一部电影了,这学期以来似乎就没看过,都忘记看电影是什么感觉了。急躁了,无法静下来,无法安静地在电脑前坐2个小时。确实急躁了。

越发觉得,人的惯性是很强的,无论一个人得到多少,就算是当了皇帝,中了头彩N千万,在开头的适应期过后,很快会习惯所拥有的东西,然后忽视它,继续渴望那些没有拥有的东西,渴望的东西得不到,烦恼就开始了。所以如果人不知足,就永远会有烦恼。以前提倡创新作文的时候,看到有个小伙子写“不知足常乐”,理由当然是不知足就有动力去追求更多的东西从而得到更大的快乐。对吗?某种情况下也许是对的,前提是追求的过程是快乐的。是不是不断地追求,得到更多的东西,就能“常乐”?根据刚才说的,当然不是。“知足常乐”才是真理。

瞥见日历,原来是4月最后一天了,五一快来了。给我的感觉还是:放不放假一个样。

成绩

2008-1-22 评论(0) 分类:随记 Tags:

没想到上了大学,对成绩的关注程度还是丝毫不减。虽然很多人说,及格就好,及格就好,但真的看到60多分的成绩,再看看其他人,80多,心里肯定不 会好过,不及格的人想及格,及格的人想高分,高分的人想第一,第一的人想满分,欲望无止境,而这些成绩有什么用呢?除了奖学金之外,还有别人对你的看法, 这才是最重要的。

一天知道班里一女生线数靠自己考了近90分,她开玩笑地说,是不是对我刮目相看呢?说实话,我确实是对她刮目相看,但我又十分鄙视痛恨以成绩看 人的……行为吧,很多人可能从小学开始就已经习惯了以成绩看人的环境,特别是城市的人,而我是在初3才开始感受到,一直到高中,特别是高三,成绩好会受人 追捧,受老师青眯,受家人赞许的眼光,成绩差就一切相反,我都经历过,成绩极差过,成绩极好过,英语考30多分时家人……怎么说呢,也不是很那个,就是我 自己当时感觉挺难受。几个大人在拉家常的时候,孩子成绩好的人说到孩子的成绩一般都会很兴奋,而孩子成绩差的就挺不爽。。都是这样,特别是高考成绩出来的 时候。其实高考争高分有一小部分是为了面子。这个面子对我来说是挺重要的。

现在作为学生整天争的就是那么几个阿拉伯数字,里面几乎包含了所有人对你的看法。似乎只要考得高分就可以证明自己实力不俗,比别人强,这对我这 种人倒是挺方便,死命跟着高考走就能得到别人的认同,但对那些有特殊才能的人就惨了。一昧关注成绩,已经被很多人抨击过了,改革也改N年了,没啥用。

上了大学,没有了高考,成绩理应退出舞台,真正考个60分就行了,但还有奖学金这种东西,让高分仍然有意义,分数还是那样倍受关注。某某,你线 数多少分啊?90多,你呢。哇,我才70多啊。哦。跟高中差不多,这样的对话还在大学继续进行,如果90同学跟70同学是表面朋友,那90同学会很爽70 同学会挺不爽,如果是真朋友,90同学会感到惋惜,不爽。

大学情况跟初中高中不太一样,在大学非常勤奋努力地学习,考得差的话,别人会觉得他笨,考得好就是理所当然,而边颓废边学习甚至全颓的学生考得 好就是天才,考不好也在情理之中。一般人都这么认为,所以大家都争先恐后地比谁更颓,言下之意就是比谁更天才。所以一般有人在比颓的时候我都保持沉默,心 里……其实这个现象高中也是有的,以前经常听到一句话:我根本没学习,笑死人,那可是真天才了。更好笑的是,我在这里这样说,隐约记得以前我自己也说过这 样的话,但没那么牛,我说我在家没学习,嘿,想起来也挺那个的。

我自己觉得成绩跟学习时间的关系就像……一时间想不起那是啥函数,类似汽车发动时速度-时间的那个图象,类似字母r,刚起步时学的时间越多成绩 提高越多,到后来学习时间再多也提高不了多少了。到达一定程度,就只能保持速度即成绩不下滑了。以前高三时有人说我要是把玩电脑的时间用在学习上成绩肯定 好很多,我一直不这么认为,我已经到了那个图象差不多四分只三的位置了,花再多时间也就那样。

另外想说下。。如果上了大学都还整天面对课本的话,那就太……用我不喜欢的一个词来说,太悲哀了(因为这词被很多人用烂了,什么现在的中国教育真是悲哀啊,什么悲哀啊现在的年轻人,看到就想吐)。

久违的状态

2008-1-11 评论(1) 分类:生活 Tags:

今天在线数的考场上,我的状态,考场气氛,再加上阴暗的天气,让我回味起了高三时光的一个场景,一个阴暗潮湿的天气里,70多人躲在一个阴暗的教室里,拼 命做题。我的高三,似乎就是这样。今天线数写得很爽,跟会不会做无关,只是状态好,没有杂念,很久没有以这样的状态做题了。事实上我还是犯了很多错误,不 过没什么可遗憾的,我感觉已经是做到我的最好了。

学习 学习

2008-1-5 评论(0) 分类:生活 Tags:

NND,大学生活真是一段一段的,又刚好被月份分割,进入1月份后生活又变了样,因为临近考试了,很多课平时又没怎么学,所以这些天都很努力在学习,又 最近手头紧没钱了,吃的东西也买不了了,所以12月的“睡死 撑死”的生活一下子就没了。相信考试不会挂科,我现在这么努力都挂那只能怪我太笨了。

放假

2007-12-30 评论(0) 分类:生活 Tags:

元旦放假3天,我感觉跟没放一样,因为这个月来感觉天天都在放假,极度自由,真是很大的反差啊,跟前几个月。现在放假因为两个人回家了,白天也很少人在宿舍,感觉很冷清,不爽。

今天问师兄一个ASP.NET的问题,问着问着他就建议我先学ASP再学.NET,嗯。。ASP.NET真有点无从下手,还是先学ASP吧,最 主要是做出那个桃李苑,要求又提高了,一个半月时间,还是算上过年的,要学好ASP和AJAX,做出一个很AJAX的桃李苑,这难度。。尽量试试。。噢, 不是尽量,是一定要做出来!这压力。。