Jscex的主要用场景是JavaScript异步编程,不过并没限制是跑在浏览器还是服务器端。近期Node.js很热门热,也刚发布了原生的Windows版,不少同掌握用它来做一些网站如此的微信小程序。现在用Node.js开发网站最著名的框架是Express,用起来也是很容易的。之前看到CNodeJS社区的一篇文章,有同学将一个Python写的ToDo列表网站移植到了Node.js上,我为了推广Jscex,就fork了这个项目,将它修改为基于Jscex的版本,大伙儿可以来比较一下。当然这个网站过于简单,我也正在探寻更适合的项目。
51CTO推荐专题:Node.js专区
JavaScript是一个没阻塞特质的语言,因此各类API都会设计为异步,这对于服务器的伸缩性和推广客户端网页的响应能力都有好处,不过在程序撰写上就会遇见各种问题了。比如在ToDo示例中的一个简单的处置函数,由于需要查看数据库,就要写成带回调的样子:
exports.index=function{ db.query{ ifreturnnext; res.render; }); };db变量用来操作MySQL数据库,它的query办法传入sql并提供一个回调函数,用来提示错误或是返回查看结果。在回调中大家需要判断err是不是存在,假如存在便调用next报告框架出错了。每一个异步操作都需要这样,试想假如在这个查看后还有另一个查看,则还需要进行一次嵌套和err判断。每一个处置函数都是这样,这也是异步编程的烦恼之1、很难进行统一的异常处置,处置代码一直需要分散在各处,一不小心就变成野异常,还非常难排查出来。
我将ToDo网站简单地Jscex化了一下。第一让MySQL的查看可以接入Jscex:
exports.jscexify=function{ db.queryAsync=function{ var_this=this; varargs=[]; for{ args.push; } vardelegate={ onStart:function{ args.push{ if{ callback; }else{ callback; } }); _this.query.apply; } }; returnnewJscex.Async.Task; } }通常来讲,将一个异步接口给Jscex化并无需那样多代码。这里近30行代码,其中大多数是为了支持变长参数,因此queryAsync函数会保留调用时的所有参数,补上一个callback,再去调用query函数本身。此时,便可以去改写之前的index等处置函数了,比如:
exports.index=toHandler{ vartodos=$await); res.render; })));toHandler函数有哪些用途,是将一个同意req和res,返回Task的函数,封装成标准的同意req、res和next三个参数的处置函数,并提供统一的错误处置:
vartoHandler=function{ returnfunction{ vartask=asyncFunc; task.addListener{ if{ next; } }); task.start; } }我在todo.js里保留了原有每个处置函数的达成,有兴趣的朋友可以对比一下它们之前的差别。可惜的是,因为ToDo实在过于简单,Jscex的优势并没表现出来太多。比如,每一个处置程序中只有一个MySQL查看,没判断和循环,更不要说为了充分借助IO并发能力,从而组合多个异步函数了。因此,我近期也一直在探寻更复杂一些的示例,不过好像用Express的开源网站并不多见,我几乎都想自己写一个了。现在感觉Nodepad好像还算很好,下面或许会对它下手。
ToDo网站依靠Express,ejs和MySQL驱动,同时我把Jscex作为添加为它的子模块。假如你要克隆一份ToDo的代码把玩一番,可以:
>gitclonegit://github.com/JeffreyZhao/todo.git >cdtodo >gitsubmoduleinit >gitsubmoduleupdate >npminstallexpressejsmysql >nodeserver.js从目前开始,我会在InfoQ中文站上发表一系列关于Jscex的文章,既有关于浏览器端的JavaScript开发,也有在服务器端借助Node.js开发的内容。可能你现在还或许会有所疑惑,比如为何要用危险的eval函数,eval和Jscex.compile函数不可以封装起来吗?其实在看了我的文章并对Jscex有了基本知道之后,就会发现这类都是以传统眼光来看待Jscex时所形成的误解。Jscex的做法的确另辟蹊径,不然在JavaScript异步类库已经多如牛毛的状况下,我不知怎么样让它崭露头角。