Почему генераторы ES6 предпочтительнее вызовов функций?
Я все еще смущен некоторыми преимуществами генераторов 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.js должен сказать о генераторах,
В отличие от реализации Connect, которая просто передает управление через ряд функций до тех пор, пока одна из них не вернется, Koa возвращает "downstream", затем управление возвращается обратно "upstream".
Разве это не то, что делает мой приведенный выше псевдокод?
1 ответ
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');
})
что не сработает, поскольку вы устанавливаете время ответа на один и тот же тик, а не тогда, когда все промежуточное программное обеспечение нижнего уровня фактически завершено.