article
Hello koa, good bye connect
这是我在没有遇到 co 和 koa 之前, 一直写的业务逻辑代码. 基于事件机制, 虽然能很好地解决 callback hells, 但是让另外一个人看懂业务逻辑, 不是一件简单的事情.
Hello koa, good bye connect
从前的 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
:)
Comments