我仍然对ES6发电机的一些优点感到困惑。怎么做,
app.use(function *(next){
var start = new Date;
yield next;
var ms = new Date - start;
this.set('X-Response-Time', ms + 'ms');
});
比较类似的东西,
app.use(function (next, ctx) {
var start = new Date;
next(ctx);
var ms = new Date - start;
ctx.set('X-Response-Time', ms + 'ms');
});
是什么让发电机对像Koa这样的东西如此特别?这就是Koa.js对发电机的看法,
对比Connect的实现只是简单地通过一系列函数传递控制直到一个函数返回,Koa产生“下游”,然后控制流回“上游”。
这不是我上面的伪代码吗?
答案 0 :(得分:3)
next
将成为常规功能。由于所有中间件都被认为是异步的,next(ctx)
不会等到所有下游中间件都完成处理。相反,你实际拥有的是Express,它没有“上游”的概念。
你实际上是:
app.use(function (downstream) {
var start = Date.now();
setImmediate(downstream);
var ms = Date.now() - start;
this.set('X-Response-Time', ms + 'ms');
})
由于您在相同的时间点设置响应时间,而不是所有下游中间件实际上都已完成执行,因此无效。