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 的一个同步逻辑代码吧:

祝大家早日用上 koa 和 co

:)

Comments

Fork me on GitHub