[JS]発電機
5392 ワード
いわゆる「デジタルジェネレータ」(Generator)
1つの特殊な関数は、必要に応じて実行を停止し、必要に応じて
定義と構造
function*キーワードとして宣言
1つ以上の最終品目文を含む
jner layerオブジェクトメソッド:next、return、throw
①nextメソッド
呼び出し時にvalueとdone propertyを持つ反復器結果オブジェクトを返す
value:計算値
done:コードの実行が完了した場合はtrue、完了していない場合はfalse
最近の最終品目文に遭遇するまでnextメソッドを呼び出します.最終文に遭遇した場合、実行を停止し、valueを返します.
nextメソッドを再度呼び出すと、次の最終品目文に遭遇するまで停止した場所で再実行されます.
=>yield:関数が一時停止を実行する場所
function* genFunc() {
console.log("첫번째 호출");
yield 1; //첫번째 호출 시에는 이 지점까지만 실행된다.
console.log("두번째 호출");
yield 2; //두번째 호출 시에는 이 지점까지만 실행된다.
console.log("세번째 호출");
yield 3; //세번째 호출 시에는 이 지점까지만 실행된다.
yield 4;
yield 5;
yield 6;
}
//호출해도 제너레이터 객체를 생성하기만 하고 함수의 코드는 실행되지 않는다.
let generator = genFunc();
console.log(generator); // Object [Generator] {}
//첫번째 호출
console.log(generator.next()); // { value: 1, done: false }
//두번째 호출
console.log(generator.next()); // { value: 2, done: false }
//세번째 호출
console.log(generator.next()); // { value: 3, done: false }
console.log(generator.return('Hi')); // {value: 'Hi', done: true}
//yield 4, 5, 6이 있음에도 undefined가 반환되는 것을 알 수 있음
console.log(generator.next()); // { value: undefined, done: true }
function* gen(n) {
let res;
res = yield n; // n: 0 ⟸ gen 함수에 전달한 인수
console.log(res); // res: 1 ⟸ 두번째 next 호출 시 전달한 데이터
res = yield res;
console.log(res); // res: 2 ⟸ 세번째 next 호출 시 전달한 데이터
res = yield res;
}
const generatorObj = gen(0);
console.log(generatorObj.next()); // 제너레이터 함수 시작
console.log(generatorObj.next(1)); // 제너레이터 객체에 1 전달
console.log(generatorObj.next(2)); // 제너레이터 객체에 2 전달
データは
②戻り方
③投げ方
function* f1() {
try {
console.log('첫번째 호출');
yield 10;
console.log('두번째 호출');
yield 20;
} catch(e) {
console.log('f1-catch', e);
}
}
let generator = f1();
console.log(generator.next()); // {value: 10, done: false}
console.log(generator.throw('에러 발생')); // {value: undefined, done: true}
数学者の強み
(
next 메소드 코드
および[Symbol.iterator]() 코드
が内蔵)評価値は
(=>無限ループを作成しても問題なく、メモリを効率的に使用できます.)
function* infinity() {
let i = 0;
while (true) yield ++i;
}
const iter = infinity();
console.log(iter.next().value); // 1
console.log(iter.next().value); // 2
console.log(iter.next().value); // 3
//실행해도 문제가 발생하지 않는 것을 알 수 있다.
(=>nextとyieldにより、関数コードは実行、停止できるため、同期プログラミングが可能)
(サードパーティ関数yieldキーワードによりサードパーティオブジェクトの実行/呼び出しを自動的に停止するnextメソッドは、サードパーティ関数を再実行する)
リファレンス
https://velog.io/@rohkorea86/Generator-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%9D%B4%ED%95%B4%ED%95%B4%EB%B3%B4%EC%9E%90-%EC%9D%B4%EB%A1%A0%ED%8E%B8-%EC%99%9C-%EC%A0%9C%EB%84%A4%EB%A0%88%EC%9D%B4%ED%84%B0-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%8D%A8%EC%95%BC-%ED%95%98%EB%8A%94%EA%B0%80#1-%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%8A%B9%EC%84%B1%EC%9D%84-%EB%8F%99%EA%B8%B0%EC%A0%81-%EC%BD%94%EB%93%9C%EB%B0%A9%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EA%B4%80%EB%A6%AC-%ED%95%B4%EC%A4%8D%EB%8B%88%EB%8B%A4
https://ko.javascript.info/generators
https://poiemaweb.com/es6-generator
https://mygumi.tistory.com/370
Reference
この問題について([JS]発電機), 我々は、より多くの情報をここで見つけました https://velog.io/@ono212/JS-Generatorテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol