2017-03-21 8 views
1

Koa.js documentation私は自分の足が非同期/待っていることや他のグッズに濡れていくにつれて、もっと知りたいと思う本当にクールな小さなプラットフォームのようです。この例では、JavaScriptジェネレータを使用する目的は何ですか?

私は新しいJSでジェネレータの役割を理解していないようです。私はこのような例に走り続ける:

// Using .is() 
const minify = require('html-minifier'); 

app.use(function * minifyHTML(next) { 
    yield next; 

    if (!ctx.response.is('html')) return; 

    let body = ctx.body; 
    if (!body || body.pipe) return; 

    if (Buffer.isBuffer(body)) body = body.toString(); 
    ctx.body = minify(body); 
}); 


// Streams 
app.use(function * (next) { 
    ctx.body = someHTTPStream.on('error', ctx.onerror).pipe(PassThrough()); 
}); 

ここを発電機を使用する目的は何ですか?私は彼らがどのように動作するのか理解していることを認めなければなりませんが、ここでそのユーティリティは絶対に見えません。非同期/稼動を待つ必要がありますか?

なぜ上記の例ではありません。

app.use(function(next) { 
    ctx.body = 'Hello World'; 
}); 

でも自分のHello Worldアプリケーションは、この行いませんので、彼らはその例を提供し、

app.use(ctx => { 
    ctx.body = 'Hello World'; 
}); 
+0

*まだ 'async' /' await'を使用興亜*は、それはまだ発電機で立ち往生(しかしためにそれらを使用していていません – Bergi

+0

Koaは、 'yield 'の使い方が' await'が本来持っている動作に似ているように、ジェネレータを手動で実行します – Bergi

答えて

1

ジェネレータは、シーケンスで次のミドルウェアを実行するためにKoaによって使用されます。

Koaジェネレータは、バージョン2.0.0より前のミドルウェア機能を処理する方法でした。 Koa 2.xはasync/awaitを代わりに使用します。これはJavaScriptの新機能です。

あなたの例に示されているミドルウェアは興亜v2の中で次のようになります。

app.use((ctx, next) => { 
    await next(); // Execute the next middleware in the sequence 

    if (!ctx.response.is('html')) return; 

    let body = ctx.body; 
    if (!body || body.pipe) return; 

    if (Buffer.isBuffer(body)) body = body.toString(); 
    ctx.body = minify(body); 
}); 
+0

したがって、ミドルウェアがなくなるまでnext-> next-> nextを実行します'if(!ctx.response)'ならば? –

+0

next()は、app.use経由でインクルードされた順番で指定された次のミドルウェアに移動します。次のミドルウェアが実行を完了すると、next()を呼び出したミドルウェアは実行を再開します。ミドルウェア・コールの再帰的なスタックとして想像することができます。各層では、各ミドルウェア・コールの前に事前処理を実行し、ミドルウェア・コール・チェーンの実行が完了した後に後処理を実行できます。 – Qyaffer

0

興亜は、ミドルウェアを積み重ねるのイデオロギーが続きますこのイデオロギーに従って重視する。

afaik、ミドルウェアはスタックとして記述されており、コード実行に関してFIFOを使用しています。

ので、あなたが提供した例に、私は最初のミドルウェア(minifyHTML)から

としてそれを読んでいます、それは最初に行う事は次のミドルウェア/ sが[完了により縮小を続行するのを待ちです。

しかし、これはasync/awaitでは当てはまりません。生成元に使用されるキーワードはfunction *() {}yieldまたはyield*ですが、async/awaitでは基本的にasync function() {}awaitです。プロミスのように結果が達成されるまで実行を一時停止するという点では同じですが、

関連する問題