next() 활용1
function* f4(one) {
let check=yield one;
console.log(one,",",check); // 10 , 30
return one+check;
}
generatorObj = f4(10);
console.log(generatorObj.next()); // { value: 10, done: false }
console.log(generatorObj.next(30)); // { value: 40, done: true }
// ----------
let getAmount = function*(qty, price) {
let amount = Math.floor(qty*price);
let discount = yield amount;
return amount-discount;
};
let getDiscount = function (amount) {
return amount>1000 ? amount*0.2 : amount*0.1;
};
let amountObj = getAmount(10,60);
let result = amountObj.next();
console.log(result);
let dcAmount = getDiscount(result.value);
console.log(dcAmount);
let result2 = amountObj.next(dcAmount);
console.log(result2);
function* f4(one) {
let check=yield one;
console.log(one,",",check); // 10 , 30
return one+check;
}
generatorObj = f4(10);
console.log(generatorObj.next()); // { value: 10, done: false }
console.log(generatorObj.next(30)); // { value: 40, done: true }
// ----------
let getAmount = function*(qty, price) {
let amount = Math.floor(qty*price);
let discount = yield amount;
return amount-discount;
};
let getDiscount = function (amount) {
return amount>1000 ? amount*0.2 : amount*0.1;
};
let amountObj = getAmount(10,60);
let result = amountObj.next();
console.log(result);
let dcAmount = getDiscount(result.value);
console.log(dcAmount);
let result2 = amountObj.next(dcAmount);
console.log(result2);
// ----------
let gen = function*(start) {
let value = start;
while(true){
yield ++value;
}
};
for(var count of gen(10)){
console.log(count);
/*
11
12
13
*/
if(count > 12){
break;
}
};
/*
for-of()문을 시작하면 gen(10)을 호출하여 제너레이터 ㅏㅎㅁ수의 start 파라미터 10을 설정하고
제너레이터 오브젝트를 생성하여 반환한다. 호출한 gen(10) 위치로 돌아오면 반환받은 오브젝트를 할당할 변수가 없으므로
엔진 내부에 저장한다.
다시 gen() 함수를 호출하여 이는 next(0를 호출한것과 같다. 처음으로 next()를 호출하였으므로 (let value-start)를 수행한후
while(true){...}를 수행한다. {value:11, done:false}를 반환하게 되며 value 프로퍼티 값이 count 변수에 설정된다.
*/
// return() : 이터레이터 종료
genObj = gen(10); // 위에있는 gen 함수 재활용
console.log(genObj.next()); // Object { value: 11, done: false }
console.log(genObj.return(30)); // Object { value: 30, done: true }
// 제너레이터 오브젝트인 genObj를 종료시킨다.
// return을 실행하면 제너레이터 함수를 호출하지 않는다. 함수를 실행하게 되면
// yield를 수행하게 되며 파라미터 값인 30이 반환되지 않고 12가 반환된다.
// 반환된값이 value:30인것은 제너레이터 함수를 실해앟여 반환된게 아니라 return()에서 만들어 반환된것이다.
console.log(genObj.next(33)); // Object { value: undefined, done: true }
// throw() : Error 발생
gen = function* () {
try{
yield 1;
} catch (e) {
yield e;
}
yield 3;
}
genObj = gen();
console.log(genObj.next()); // { value: 1, done: false }
console.log(genObj.throw("에러")); // { value: "에러", done: false }
console.log(genObj.next()); // { value: 3, done: false }
// throw() 를 호출하면 catch(0 블록을 수행하지만 이터레이터가 종료된것이 아니므로 next()를 통해 value : 3을 반환이 가능하다.
// 예시2
gen = function*() {
throw "에러";
yield 10;
};
genObj = gen();
try{
let result = genObj.next();
} catch (e) {
console.log(e); // 에러
}
console.log(genObj.next()); // { value: undefined, done: true }
// throw 때문에 next() 를 하여도 yield는 실행되지 않는다.
// yield* 키워드
function* f5() {
yield* [1,2,3];
}
genObj = f5();
console.log(genObj.next()); // { value: 1, done: false }
console.log(genObj.next()); // { value: 2, done: false }
console.log(genObj.next()); // { value: 3, done: false }
console.log(genObj.next()); // { value: undefined, done: true }
let plusGen = function*(value) {
yield value+5;
yield value+10;
};
gen = function*(value) {
yield* plusGen(value);
yield value+20;
};
genObj = gen(10);
console.log(genObj.next()); // { value: 15, done: false }
console.log(genObj.next()); // { value: 20, done: false }
console.log(genObj.next()); // { value: 30, done: false }
console.log(genObj.next()); // { value: undefined, done: true }
gen = function*(value) {
yield value;
yield* gen(value+10);
};
genObj = gen(3);
console.log(genObj.next()); // { value: 3, done: false }
console.log(genObj.next()); // { value: 13, done: false }
console.log(genObj.next()); // { value: 23, done: false }
반응형
'WEB > ECMAScript' 카테고리의 다른 글
Class -> extends / super / 빌트인 오브젝트 상속 / static / Class 호이스팅불가 (0) | 2020.03.01 |
---|---|
Class -> 메서드 선언, 상속 메커니즘 (0) | 2020.02.27 |
RegExp Object / Generator Object (0) | 2020.02.25 |
Template Literal / Array Object (0) | 2020.02.25 |
Math 오브젝트 / String Object (0) | 2020.02.25 |