ECMAScript 6 (21)Generator 함수의 구문
1.무엇
function* test(){
yield 'hello';
yield 'world';
return 'end';
}
var tt = test()
tt.next() // {value: "hello", done: false}
tt.next() // {value: "world", done: false}
tt.next() // {value: "end", done: false}
tt.next() // {value: undefined, done: true}
function* f() {
console.log(' !')
}
var generator = f();
setTimeout(function () {
generator.next()
}, 2000);
function* demo() {
console.log('Hello' + yield); // SyntaxError
console.log('Hello' + yield 123); // SyntaxError
console.log('Hello' + (yield)); // OK
console.log('Hello' + (yield 123)); // OK
}
function* demo() {
foo(yield 'a', yield 'b'); // OK
let input = yield; // OK
}
var myIterable = {};
myIterable[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
[...myIterable] // [1, 2, 3]
function* gen(){
yield 1;
yield 2;
}
var g = gen();
[...g] // [1,2]
2. next()
function* foo(x) {
var y = 2 * (yield (x + 1));
var z = yield (y / 3);
return (x + y + z);
}
var a = foo(5);
a.next() // Object{value:6, done:false}
a.next() // Object{value:NaN, done:false}
a.next() // Object{value:NaN, done:true}
var b = foo(5);
b.next() // { value:6, done:false }
b.next(12) // { value:8, done:false }
b.next(13) // { value:42, done:true }
3. for…of
function* foo() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
return 6;
}
for (let v of foo()) {
console.log(v);
}
// 1 2 3 4 5
function* numbers () {
yield 1
yield 2
return 3
yield 4
}
//
[...numbers()] // [1, 2]
// Array.from
Array.from(numbers()) // [1, 2]
//
let [x, y] = numbers();
x // 1
y // 2
// for...of
for (let n of numbers()) {
console.log(n)
}
// 1
// 2
4. Generator.prototype.throw()
var g = function* () {
try {
yield;
} catch (e) {
console.log(' ', e);
}
};
var i = g();
i.next();
try {
i.throw('a');
i.throw('b');
} catch (e) {
console.log(' ', e);
}
// a
// b
var gen = function* gen(){
try {
yield console.log('a');
} catch (e) {
// ...
}
yield console.log('b');
yield console.log('c');
}
var g = gen();
g.next() // a
g.throw() // b
g.next() // c
5.Generator.prototype.return()
function* gen() {
yield 1;
yield 2;
yield 3;
}
var g = gen();
g.next() // { value: 1, done: false }
g.return('foo') // { value: "foo", done: true }
g.next() // { value: undefined, done: true }
function* numbers () {
yield 1;
try {
yield 2;
yield 3;
} finally {
yield 4;
yield 5;
}
yield 6;
}
var g = numbers();
g.next() // { value: 1, done: false }
g.next() // { value: 2, done: false }
g.return(7) // { value: 4, done: false }
g.next() // { value: 5, done: false }
g.next() // { value: 7, done: true }
6. yield*
Generator 함수 내부에서 다른 Generator 함수를 호출합니다.전자의 함수체 내부에서 수동으로 옮겨다니는 것이 필요하다.
function* foo() {
yield 'a';
yield 'b';
}
function* bar() {
yield 'x';
// foo()
for (let i of foo()) {
console.log(i);
}
yield 'y';
}
for (let v of bar()){
console.log(v);
}
// x
// a
// b
// y
function* bar() {
yield 'x';
yield* foo();
yield 'y';
}
//
function* bar() {
yield 'x';
yield 'a';
yield 'b';
yield 'y';
}
//
function* bar() {
yield 'x';
for (let v of foo()) {
yield v;
}
yield 'y';
}
for (let v of bar()){
console.log(v);
}
// "x"
// "a"
// "b"
// "y"
function* foo() {
yield 2;
yield 3;
return "foo";
}
function* bar() {
yield 1;
var v = yield* foo();
console.log("v: " + v);
yield 4;
}
var it = bar();
it.next()
// {value: 1, done: false}
it.next()
// {value: 2, done: false}
it.next()
// {value: 3, done: false}
it.next();
// "v: foo"
// {value: 4, done: false}
it.next()
// {value: undefined, done: true}
7. 객체 속성인 Generator 함수
let obj = {
* myGeneratorMethod() {
···
}
//
myGeneratorMethod: function* () {
// ···
}
};
8. this
function *g() {
console.log(this)
yield 'g'
}
let foo = g()
foo.next()
// Window
// {value: "g", done: false}
function* F() {
this.a = 1;
yield this.b = 2;
yield this.c = 3;
}
var obj = {};
var f = F.call(obj);
f.next(); // Object {value: 2, done: false}
f.next(); // Object {value: 3, done: false}
f.next(); // Object {value: undefined, done: true}
obj.a // 1
obj.b // 2
obj.c // 3
function* F() {
this.a = 1;
yield this.b = 2;
yield this.c = 3;
}
var f = F.call(F.prototype);
f.next(); // Object {value: 2, done: false}
f.next(); // Object {value: 3, done: false}
f.next(); // Object {value: undefined, done: true}
f.a // 1
f.b // 2
f.c // 3
9. 상태기
var flag = true;
var toggle = function(){
if(flag)
// show
else
// hide
flag = !flag
}
var toggle = function* () {
while (true) {
// show
yield;
// hide
yield;
}
};
10. 적용
function delay(msg, callback) {
setTimeout(function () {
console.log(msg)
callback()
}, 1000)
}
delay('1', function () {
delay('2', function () {
delay('3', function () {
delay('4', function () {
delay('5', function () {
console.log('done')
})
})
})
})
})
function delay(msg) {
return new Promise((resolve, reject) => {
setTimeout(function () {
console.log(msg)
resolve()
}, 1000)
})
}
delay('1')
.then(() => delay('2'))
.then(() => delay('3'))
.then(() => delay('4'))
.then(() => delay('5'))
.then(() => {
console.log('done')
})
- 위의 코드는 결합도가 높고 모든 비동기가 프로미스이어야 하며 그렇지 않으면 안 된다.그래서 Generator 함수가 등장하여 이런 장면을 해결하는 가장 좋은 방법이다.
function delay(msg) {
setTimeout(function () {
iter.next(msg)
}, 1000)
}
function*g() {
let result1 = yield delay('1')
console.log(result1)
let result2 = yield delay('2')
console.log(result2)
let result3 = yield delay('3')
console.log(result3)
let result4 = yield delay('4')
console.log(result4)
let result5 = yield delay('5')
console.log(result5)
console.log('done')
}
let iter = g()
iter.next()
10.2 배포 범람기 인터페이스
let obj = {
a: 1,
b: 2,
c: 3,
*[Symbol.iterator]() {
yield this.c
yield this.b
yield this.a
}
}
let arr = [...obj];
arr; // [3, 2, 1]
참고 문헌: 완일봉es6
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
React의 이벤트 핸들러에서 "Cannot read property '〇〇' of undefined"라고 나온다ES6 기법으로 React 코드를 쓰고 있을 때 이벤트 핸들러 내에서 this 를 사용할 수 없게 되었기 때문에 그 원인을 공유합니다. App.jsx 이 경우 브라우저에서 실행해 보면 다음과 같이 표시됩니다. 이 버...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.