home

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

祝大家早日用上 koa 和 co

:)

Thank you for reading, and have a great day!

Comments