Koajs-generators
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 に割り当てました。 次に、このitr変数で* next()*の呼び出しを開始しました。
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);
上記のコードを実行して [[1]] に移動すると、コンソールに次の出力が表示されます。
1
3
5
6
4
2
これは、本質的にKoaがジェネレーターを使用する方法です。 このプロパティを使用してコンパクトなミドルウェアを作成し、アップストリームとダウンストリームの両方の機能のコードを記述することができるため、コールバックを回避できます。