2014-01-22 3 views
1

Я все еще смущен некоторыми преимуществами генераторов 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, которая просто не проходит контроль через ряд функций, пока один возвращается, Коа дает «вниз», то управление переходит обратно «вверх».

Разве это не то, что делает мой выше псевдокод?

+0

Может быть, мое объяснение о генераторах поможет вам http://stackoverflow.com/a/24967036/1090562 –

ответ

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

, который не будет работать, так как вы устанавливаете время отклика на том же клеща, не тогда, когда все вниз промежуточного слоя фактически завершается выполнение.

+0

Ну, почему все среднее изделие должно быть асинхронным? Это не асинхронно в Коа, не так ли? Не все ли вызовы «выход» синхронно? –

+2

выглядит синхронно, но генераторы могут быть асинхронными или синхронными. 'yield' означает, что выполнение могло быть остановлено, но вы не знаете, действительно ли оно асинхронно изнутри генератора. –

+0

Я понятия не имею, о чем вы говорите. Я не уверен, что это я или ты. –

Смежные вопросы