Koa.js-ジェネレーター

JavaScript ES6の最もエキサイティングな新機能の1つは、ジェネレーターと呼ばれる新しい種類の関数です。ジェネレーターの前は、スクリプト全体が通常は上から下の順序で実行され、コードの実行を停止して後で同じスタックで再開する簡単な方法はありませんでした。ジェネレーターは、終了して後で再入力できる関数です。それらのコンテキスト(変数バインディング)は、再入力間で保存されます。

ジェネレーターを使用すると、その間にコードの実行を停止できます。したがって、簡単なジェネレーターを見てみましょう。

var generator_func = function* (){
   yield 1;
   yield 2;
};

var itr = generator_func();
console.log(itr.next());
console.log(itr.next());
console.log(itr.next());

上記のコードを実行すると、次のようになります。

{ value: 1, done: false }
{ value: 2, done: false }
{ value: undefined, done: true }

上記のコードの内部を見てみましょう。まず、と呼ばれるジェネレータを作成しますgenerator_func()。この奇妙な外観の関数のインスタンスを作成し、に割り当てましたitr。それから私たちは電話をかけ始めましたnext() このitr変数で。

next()を呼び出すと、ジェネレーターが起動し、yieldに達するまで実行されます。次に、値と完了を含むオブジェクトを返します。値には式の値があります。この式は何でもかまいません。この時点で、実行を一時停止します。この関数(next)を呼び出すと、ジェネレーターは最後の降伏点から実行を再開し、関数の状態は一時停止時と同じで、次の降伏点まで続きます。これは、コードにイールドポイントがなくなるまで行われます。

コアの発電機

では、なぜこのチュートリアルでジェネレータについて説明しているのでしょうか。hello worldプログラムから覚えているかもしれませんが、私たちはfunction* ()app.use()にコールバックを渡す表記。Koaはオブジェクトであり、ミドルウェアジェネレーター関数の配列が含まれています。これらの関数はすべて、要求ごとにスタックのように構成および実行されます。Koaは、制御フローのダウンストリームとそれに続くアップストリームも実装します。

これをよりよく理解するには、次の例を見てください。

var koa = require('koa');
var app = koa();
 
app.use(function* (next) {
   //do something before yielding to next generator function 
   
   //in line which will be 1st event in downstream
   console.log("1");
   yield next;
 
   //do something when the execution returns upstream, 
   //this will be last event in upstream
   console.log("2");
});
app.use(function* (next) {
   // This shall be 2nd event downstream
   console.log("3");
   yield next;
 
   // This would be 2nd event upstream
   console.log("4");
});
app.use(function* () { 
   // Here it would be last function downstream
   console.log("5");
   
   // Set response body
   this.body = "Hello Generators";

   // First event of upstream (from the last to first)
   console.log("6");
});

app.listen(3000);

上記のコードを実行してに移動するとき https://localhost:3000/ コンソールに次の出力が表示されます。

1
3
5
6
4
2

これは基本的に、Koaがジェネレーターを使用する方法です。これにより、このプロパティを使用してコンパクトなミドルウェアを作成し、アップストリーム機能とダウンストリーム機能の両方のコードを記述できるため、コールバックから解放されます。