精品 Hello koa, good bye connect
发布于 11 年前 作者 fengmk2 8258 次预览 最后一次回复是 11 年前 来自 分享
从前的 connect
var connect = require('connect');
var eventproxy = require('eventproxy');
var tair = require('./common/tair');
var app = connect();
// TODO: add render
app.use(function (req, res, next) {
var ep = eventproxy.create();
ep.fail(next);
// 并发取 k1, k2
tair.get('k1', ep.done('v1'));
tair.get('k2', ep.done('v2'));
tair.on('v1', function (v1) {
// k1 取完接着取 k3
if (v1) {
return tair.get('k3', ep.done('v3'));
}
ep.emit('v3');
});
ep.all('v1', 'v2', 'v3', function (v1, v2, v3) {
res.render('home.html', {
v1: v1,
v2: v2,
v3: v3
});
});
});
app.listen(1984);
这是我在没有遇到 co 和 koa 之前, 一直写的业务逻辑代码. 基于事件机制, 虽然能很好地解决 callback hells, 但是让另外一个人看懂业务逻辑, 不是一件简单的事情.
现在的 koa
var koa = require('koa');
var thunkfiy = require('thunkify-wrap');
var tair = require('./common/tair');
tair.get = thunkfiy(tair.get);
var app = koa();
// TODO: add render
app.use(function *(next) {
var ep = eventproxy.create();
ep.fail(next);
// 并发取 k1, k2
var rs = yield [tair.get('k1'), tair.get('k2')];
var v1 = rs[0];
var v2 = rs[1];
var v3 = null;
if (v1) {
// k1 取完接着取 k3
v3 = yield tair.get('k3');
}
yield this.render('home.html', {
v1: v1,
v2: v2,
v3: v3
});
});
app.listen(1984);
一切都是回归同步顺序的方式, 从上到下这样顺序写, 顺序执行. 很适合后端编码的思维.
如果大家已经熟悉了事件编程, 或者看惯了 callback, 那么 koa 一开始看起来还是比较奇怪的. 为什么能这么神奇.
一旦大家用上了 koa , 就无法回头写 callback 了.
神马? 没多大差别啊
厄, 看来你的功力不错, 好吧, 那大家来看看 cnpm 的一个同步逻辑代码吧:
- callback 和 事件版本: https://github.com/cnpm/cnpmjs.org/blob/3526c9eff7616098ed1cbd52378198f8b2b77de4/proxy/sync_module_worker.js
- co 版本: https://github.com/cnpm/cnpmjs.org/blob/master/proxy/sync_module_worker.js
祝大家早日用上 koa 和 co
:)
原文地址: http://fengmk2.cnpmjs.org/blog/2014/03/koa-vs-connect.html
19 回复
早用上了,哈哈~
看来你们是完全拥抱koa的节奏哈
这个拥抱koa的节奏啦,空了我也试试!
即将koa!
看上去好吊的感觉,把lua那套都搞进来了。。当时就应该弄node.lua~
哈哈, js原生支持, 现在不用纠结callback了
@suqian 目前性能要差点吧
暂时看不出比较大的区别,有空学习一下KOA,感觉NBHH的。。。。。
@fantasyni 你可以去看看koa的性能测试
楼主借你宝地问个问题… 能告诉我上github的方法不? 用goagent 速度一坨shi啊 … 看你天天很活跃,你们是用什么方式上的啊 先谢谢啦
@suqian node 版本支持 harmony 的性能还行,其他版本 generator 出来的,性能差个几十倍要的
185.31.16.184 github.global.ssl.fastly.net
@suqian 可以了 灰常感谢 ~
楼主有关于koa的性能测试报告吗?现在co文档里提到了性能问题 Currently you must use the --harmony-generators flag when running node 0.11.x to get access to generators. Or use gnode to spawn your node instance. However note that performance degrades quickly compared to 0.11.x.
https://github.com/koajs/koa/blob/master/docs/koa-vs-express.md
这个是说如果不是在 0.11.x 的环境下,用 gnode 的话性能会下降很多,如果在 0.11.x,就不会有性能问题
目测楼主是TJ粉,哈哈
好像还是有差吧 代码1 是k1、k2并行取,k3在k1完成后取,不需等k2 代码2 是k1、k2并行取,k3在k1,、k2都完成后才取 是这样吗?