初识Koa(二)

JerryXia 发表于 , 阅读 (0)

我们已经知道了thunks是如何工作的,现在来看看其他类型吧

并行执行

var read = thunkify(fs.readFile);co(function *() {  // 3 concurrent reads  var reads = yield [read('input.txt'), read('input.txt'), read('input.txt')];  console.log(reads);  // 2 concurrent reads  reads = yield { a: read('input.txt'), b: read('input.txt') };  console.log(reads);})();

如果在yield后面是array类型或者object类型,那么将会并行执行。需要注意的是数组或对象的成员必须是thunks或者generators,还可以相互嵌套。如下所示:

var read = thunkify(fs.readFile);co(function *() {  var a = [read('input.txt'), read('input.txt')];  var b = [read('input.txt'), read('input.txt')];  // 4 concurrent reads  var files = yield [a, b];  console.log(files);})();

你还可以在调用了thunk之后再来置于yield之后,如下所示:

var read = thunkify(fs.readFile);co(function *() {  var a = read('input.txt');  var b = read('input.txt');  // 2 concurrent reads  console.log([yield a, yield b]);  // or  // 2 concurrent reads  console.log(yield [a, b]);})();

现在你应该掌握了generators的原理了,知道了如何使用它来完成异步流。现在我们再来了解一下Koa本身。

Koa

始终记住一点,每一个koa模块应该只做一件事。

Application

var koa = require('koa');var app = koa();

创建一个Koa app只需要调用依赖的模块koa就可以了。koa()返回的对象可以包含一组generators(或者说middlewares)。

Cascading (级联)

Middleware(中间件),在Koa中的表现就是用来处理请求。所谓级联,是指由一系列的中间件构成的控制流。在web开发中,这会非常有用。Koa使用generators来实现级联,等下游的generator执行完,控制流再回到上游的generator。给use方法传递一个generator function来向控制流中添加generator。看看下面这段代码为什么依次打印A,B,C,D,E。

app.use(function *(next) {  console.log('A');  yield next;  console.log('E');});app.use(function *(next) {  console.log('B');  yield next;  console.log('D');});app.use(function *(next) {  console.log('C');});app.listen(3000);

当一个请求进来时,请求沿着中间件,一层层往下走。所以在上面的代码中,请求启动了第一个中间件,于是打印A,然后遇到了yield nex。当一个中间件遇到yield next的时候,它将会进入到下个中间件中。所以接着打印B,然后又遇到了yield next,进入下个中间件,打印C。打印完C后,发现没有多余的中间件了,于是开始往回走,回到上个中间件,就是一个出栈的操作一样。然后打印D,回到上个中间件,打印E。