1

我仍然对 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 产生“下游”,然后控制流回到“上游”。

这不是我上面的伪代码所做的吗?

4

1 回答 1

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');
})

这将不起作用,因为您将响应时间设置在同一滴答声上,而不是在所有下游中间件实际完成执行时。

于 2014-01-22T20:45:13.830 回答