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

祝大家早日用上 koa 和 co

:)

原文地址: http://fengmk2.cnpmjs.org/blog/2014/03/koa-vs-connect.html

19 回复
xieren58

早用上了,哈哈~

Pana

看来你们是完全拥抱koa的节奏哈

echorenyuan

这个拥抱koa的节奏啦,空了我也试试!

DoubleSpout

看上去好吊的感觉,把lua那套都搞进来了。。当时就应该弄node.lua~

fengmk2

哈哈, js原生支持, 现在不用纠结callback了

@suqian 目前性能要差点吧

bornkiller

暂时看不出比较大的区别,有空学习一下KOA,感觉NBHH的。。。。。

fengmk2

@fantasyni 你可以去看看koa的性能测试

luckyan315

楼主借你宝地问个问题… 能告诉我上github的方法不? 用goagent 速度一坨shi啊 … 看你天天很活跃,你们是用什么方式上的啊 先谢谢啦

@suqian node 版本支持 harmony 的性能还行,其他版本 generator 出来的,性能差个几十倍要的

luckyan315

@suqian 可以了 灰常感谢 ~

yonghuang

楼主有关于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.

dead-horse

这个是说如果不是在 0.11.x 的环境下,用 gnode 的话性能会下降很多,如果在 0.11.x,就不会有性能问题

chjjin

目测楼主是TJ粉,哈哈

czxbin

好像还是有差吧 代码1 是k1、k2并行取,k3在k1完成后取,不需等k2 代码2 是k1、k2并行取,k3在k1,、k2都完成后才取 是这样吗?