精华 Hello koa, good bye connect
发布于 8 年前 作者 fengmk2 6444 次浏览 最后一次编辑是 5 年前 来自 分享

从前的 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

18 回复

早用上了,哈哈~

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

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

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

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

@suqian 目前性能要差点吧

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

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

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

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

@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.

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

目测楼主是TJ粉,哈哈

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

回到顶部