この記事の内容は、ES6 におけるジェネレーターとは何ですか? ES6 での Generator の導入は一定の参考になります。必要な方は参考にしていただければ幸いです。
ES6 のジェネレーター
ジェネレーターは ES6 の非常に興味深い機能ですが、理解するのが簡単ではない機能でもあります。 let/const
がブロックレベルのスコープを提供するという明白な目的とは異なり、これの目的は何でしょうか?
まず、問題を明確にする必要があります。JavaScript では、関数の実行が開始されると、実行が完了するまで停止することはできません (デバッグについては言わないでください。製品を使用していて、コードをデバッグする必要があるユーザーを見たことがありますか?
ただし、Generator はこの機能を提供します。次のコードを見てください。
function *g(){ console.log('start'); yield 1; console.log('middle'); yield 2; console.log('end'); } var g1 = g(); console.log(g1.next()); // start // {value: 1, done: false} console.log(g1.next()); // middle // {value: 2, done: false} console.log(g1.next()); // end // {value: undefined, done: true}
出力結果によると、関数 g で yield キーワードが検出されると、実行中のプログラムが停止することがわかります。 next() メソッドを呼び出すことによってのみ、関数 g のコードが実行され続けます。したがって、関数 g 自体は一時停止状態になります。
この時点で、次のことを知っておく必要があります。
ジェネレーターは関数ではなく、関数でも、関数でもありません。
g() はすぐに実行を開始しますが、実行されるとすぐに一時停止し、まず従来の例を見てみましょう:
function asyn(fn) { return new Promise((resolve,reject)=>{ setTimeout(()=>{ fn(); resolve(true); }, 1000); }); } function main() { console.log('start'); asyn(function(d) { console.log('async one'); asyn(function(d) { console.log('async two'); console.log('end'); }); }); } main();
function asyn(fn) { return new Promise((resolve,reject)=>{ setTimeout(()=>{ fn(); resolve(true); }, 1000); }); } co(function*() { console.log('start'); yield asyn(function(d) { console.log('async one'); }); yield asyn(function(d) { console.log('async two'); }); console.log('end'); }); function co(fn) { return new Promise((resolve,reject)=>{ let g = fn(); onFullfilled(); function onFullfilled() { let ret = null; ret = g.next(); next(ret); } function next(ret) { if(ret.done) return resolve(ret.value); ret.value.then(onFullfilled); } } ); }
Generator と Koa
Koa は、Node.js に基づく Web アプリケーション フレームワークです。 Koa で処理される非同期プログラムは、主にネットワーク リクエスト (HTTP)、ファイル読み取り、データ クエリです。ここには多くの非同期シナリオがあり、プログラムの階層化を追加して従来のコールバック方式を使用すると、コールバックが多すぎます。app.on('get', function(){ auth(function(){ router(function(){ find(function(){ save(function(){ render(function(){ //...... }) }) }) }) }) })
以上がES6 におけるジェネレーターとは何ですか? ES6 のジェネレーターの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。