koa2官方推荐的回调解决方案到底是什么?
发布于 4 年前 作者 solarhell 7451 次浏览 来自 问答

koa2 有类似于最佳实践的东西吗? 一种说法是使用 generator,另一种说法是使用 co。 希望有使用的同学可以帮忙解惑,谢谢了!(我使用的Node v6)

8 回复

你把 generator 和 co 同时使用一下,对比对比,然后就会发现。。。

这是同一种东西。。。

generator的出现时,感觉是ES6取代co的

楼主概念不清啊。 tj最先是做了co,也就是协程的意思,然后koa是co的上层建筑。生成器是最底层的,有生成器才有了co。阮一峰有篇文章写的很清楚。

推荐的是使用 async/await, 当然你要介意使用 babel, 使用 co.wrap 跟一个 async function 一致, 也是可以的。 详见 https://cnodejs.org/topic/5709cb2f94b38dcb3c09a7ac (这篇应在想用 async/await 但是不想在服务端使用 babel 的情况下阅读)

@klausgao 非常感谢! 解决了我的疑惑

@magicdawn 非常感谢!之前一直考虑要不要使用 现在有个底了

co是基于generator,实现了异步处理同步化,比如:

  co(function *() {
	  let user = yield db.getUser();
	  user.name = 'ron';
	  yield user.save();
  });

Koa1.0内嵌了co,是我们写action的时候不用麻烦的还要用co,比如:

let app = require('koa');
let router = require('koa-reouter');
router.get('/profiles', function *() {
	this.body = yield db.getProfiles();
});
app.use(router.routes());

Koa 2.0,使用async/await 取代了generator/yield,比如:

let app = require('koa');
let router = require('koa-reouter');
router.get('/profiles', async ctx => {
	ctx.body = await db.getProfiles();
});
app.use(router.routes());

async/await 是ES7的标准,现在node.js应该还没有build-in,而TJ不建议在服务端(node.js)中使用transform,所以现在koa2.0还是alpha版本,但是实际上koa2.0已经没有问题,可以用于production,参见:https://github.com/koajs/koa/issues/533。

现在要在nodejs中用koa2.0,必须用babel-node来transform,而transform后其实就是generator/yield,但以后等V8和nodejs内置了async/await后,就和generator/yield完全不一样了。

回到顶部