ジェネレーターは、JavaScriptのコルーチン(コルーチン)スタイルです。それは、実行中に一時停止してから再開できる機能を指します。関数には、関数*などの関数にアスタリスク記号が伴い、関数の特徴的なキーワード、収量や収量*などが伴います。
function* generatorfn(){console.log( 'look ma i suspended')} var generator = generatorfn()// [1] setimeout(function(){generator.next()// [2]}、2000)コードでマークされた[1]と[2]は次のように説明されています。
1.これは、一時停止から始まるジェネレーターです。現時点ではコンソール出力はありません。
2。次の()メソッドを呼び出すことによってのみ、ジェネレーターを実行して実行することができます。これで、コンソール出力があります。
別のケースを見てみましょう:
function *generator(){console.log( 'start!'); var i = 0; while(true){if(i <3)every i ++; }} var gen = generator();上記のコードは最初のコードに似ていますが、ジェネレーター関数には追加の収量キーワードがあります。上記のコードが呼び出されると、すぐに実行されることはありませんが、スタンバイ状態を一時停止するため、出力が開始されません。次の()呼び出しまで実行されません。
var ret = gen.next(); // start!console.log(ret); // {value:0、done:false}上記のRETはジェネレーターの結果です。 2つのプロパティがあります。
■値、発電機関数の降伏値、
■完了、これはジェネレーター関数が戻るかどうかを示すフラグです。
次のようにコードを続行します。
console.log(gen.next()); // {value:1、done:false} console.log.log(gen.next()); // {value:2、done:false} console.log(gen.next()); // {value:undefined、done:true}ジェネレーターは同期プログラミングに謎がなく、特に非同期プログラミングに適しています。
ジェネレーターには2つの特性があります。
1.関数からジャンプすることを選択し、外部コードにこの関数に戻る時期を決定し、実行を継続させることができます。
2。非同期制御を実行できます。
次の非同期実行コードを見てください。
var gen = generator(); console.log(gen.next()。value); setimeout(function(){console.log(gen.next()。value); console.log( 'first step');}、1000); console.log( 'second step');出力は次のとおりです。
0
ステップ2
1
最初のステップ
言い換えれば、タイムアウトがSettimeoutで終了するのを待つことはありませんが、「2番目のステップ」を直接続け、SettimeOutでブロックされません。
別のコードを見てみましょう:
function* channel(){var name = hired 'こんにちは、あなたの名前は何ですか?」 // [1] return 'well hi there' + name} var gen = channel()console.log(gen.next()。value)//こんにちは、あなたの名前は何ですか? [2] console.log(gen.next( 'billy'))//よくこんにちは[3]トラバーサル中に *を使用することもできます。
function* iter(){for(var i = 0; i <10; i ++)every i} for(var val of iter()){console.log(val)//出力1? - ?9}一般的な誤解
関数の実行を一時停止できるので、それらを並行して実行させる必要がありますか?いいえ、JavaScriptは単一のスレッドであり、パフォーマンスの改善を求めたい場合、ジェネレーターはあなたの料理ではありません。
たとえば、次のコードはFibonacci番号を個別に実行します。
function fib(n){var current = 0、next = 1、swap for(var i = 0; i <n; i ++){swap = current = next next = swap+next} return current} function* fibgen(n){var current = 0、next 1、swap for(var i = 0; i ++)パフォーマンスの結果は次のとおりです。(高いほど良い)
結果:
通常の1263899
ジェネレーター37541
ジェネレーターは輝いています
ジェネレーターは、JavaScriptの機能の複雑さを簡素化できます。
怠zyな割り当て
怠zyな割り当てはJSクロージャーを使用して実装できますが、利回りを使用すると大幅に簡素化されます。一時停止と回復により、必要なときに数値を取得できます。たとえば、上記のFibgen関数は、必要なときに新しい値を引き出すことができます。
var fibiter = fibgen(20)var next = fibiter.next()console.log(next.value)setimeout(function(){var next = fibiter.next()console.log(next.value)}、2000)もちろん、ループを使用します。無限シーケンス
値を割り当てるのが面倒なので、無限のシーケンスと同様に、いくつかのHaskellトリックを実行できます。ここでは、無限のシーケンスの数を生成できます。
function* fibgen(){var current = 0、next = 1、swap while(true){swap = current、current = next = swap + next evelue current}}}フィボナッチストリームの怠zyな割り当てを見て、5000の後に最初のフィボナッチ数を返すように頼みましょう。
for(var num of fibgen()){if(num> 5000)break} console.log(num)// 6765非同期プロセス制御
ジェネレーターを使用して非同期プロセス制御を実装します。
ノードの世界では、すべてがコールバックに関連しており、これは私たちの低レベルの非同期関数です。発電機を使用して通信チャネルを構築して、同期プログラミングのスタイルで非同期コードを作成できます。
run(function*(){console.log( "start")var file = hiread readfile( "./ async.js")// [1] console.log(file.tostring()}))注1とは、Async.jsが結果を返すのを待つ前にプログラムが続くことを意味します。
Genifyは、ジェネレーターを通常のプログラミング環境に導入するフレームワークです。以下を使用してください。
npmインストールのインストールのために、コードは次のとおりです。
var q = require( 'q'); var fs = require( 'fs'); var genify = require( 'genify'); //オブジェクトをgenify functionvar object = genify({concatfiles:function *(file1、file2、outfile){file1 = hieds q.nfcall(fs.readfile、file1); file2 = evels q.nfcall(fs.readfile、file2); var conconated = file1 + file2; }}); // concatfilesは、ジェネレーターの強力な機能を使用するジェネレーター関数です。 object.concatfiles( './ somefile1.txt'、 './somefile2.txt'、 './concated.txtnode.jsでJavaScriptジェネレーターを使用する上記の詳細な説明は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。