es6 Generator
간단한 소개
function* helloWorldGenerator() {
yield 'hello';
yield 'world';
return 'ending';
}
var hw = helloWorldGenerator();
hw.next()
// { value: 'hello', done: false }
hw.next()
// { value: 'world', done: false }
hw.next()
// { value: 'ending', done: true }, done true
hw.next()
// { value: undefined, done: true }
yield 문
ield 문장 자체에 되돌아오는 값이 없거나, 항상 undefined로 되돌아옵니다.next 방법은 매개 변수를 가져올 수 있습니다. 이 매개 변수는 이전 yield 문장의 반환값으로 간주됩니다.첫 번째next 방법을 사용할 때 파라미터를 가지고 있을 수 없습니다. V8 엔진은 첫 번째next 방법을 사용할 때의 파라미터를 직접 무시합니다. 두 번째next 방법을 사용할 때부터만 파라미터가 유효합니다.의미에서 첫 번째next 방법은 플러그인 대상을 시작하는 데 사용되기 때문에 파라미터를 가지고 있지 않습니다.
function* f() {
for(var i=0; true; i++) {
var reset = yield i;
if(reset) { i = -1; }
}
}
var g = f();
g.next() // { value: 0, done: false }
g.next() // { value: 1, done: false }
g.next(true) // { value: 0, done: false }
next 방법의 매개 변수를 통해Generator 함수 내부에 값을 입력합니다
function* dataConsumer() {
console.log('Started');
console.log(`1. ${yield}`);
console.log(`2. ${yield}`);
return 'result';
}
let genObj = dataConsumer();
genObj.next();
// Started
genObj.next('a')
// 1. a
genObj.next('b')
// 2. b
Iterator 인터페이스와의 관계
(...) , 。
let z = { a: 3, b: 4 };
let n = { ...z };
n // { a: 3, b: 4 }
。
let ab = { ...a, ...b };
//
let ab = Object.assign({}, a, b);
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 },return , vaule undefined
g.next() // { value: undefined, done: true }
yield* 문
function* foo() {
yield 'a';
yield 'b';
}
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"
yield* Generator , for...of
만약에 yield* 뒤에 하나의 그룹이 따라가면 그룹의 원생이 플러그인을 지원하기 때문에 그룹 구성원, 그리고 문자열 같은 Iterator 인터페이스가 있는 데이터 구조를 플러그인으로 옮긴다.function* gen(){
yield* ["a", "b", "c"];
}
gen().next() // { value:"a", done:false }
// ,
// 、
function Tree(left, label, right) {
this.left = left;
this.label = label;
this.right = right;
}
// (inorder) 。
// , generator 。
// , yield*
function* inorder(t) {
if (t) {
yield* inorder(t.left);
����� yield t.label;
yield* inorder(t.right);
}
}
//
function make(array) {
//
if (array.length == 1) return new Tree(null, array[0], null);
return new Tree(make(array[0]), array[1], make(array[2]));
}
let tree = make([[['a'], 'b', ['c']], 'd', [['e'], 'f', ['g']]]);
//
var result = [];
for (let node of inorder(tree)) {
result.push(node);
}
result
// ['a', 'b', 'c', 'd', 'e', 'f', 'g']
Generator의 일부 응용 프로그램
비동기식
yield , next
function* main() {
var result = yield request("http://some.url");
var resp = JSON.parse(result);
console.log(resp.value);
}
function request(url) {
makeAjaxCall(url, function(response) {
it.next(response); // yield , , response
});
}
var it = main();
it.next();
프로세스 제어
,
function* parallelDownloads() {
let [text1,text2] = yield [
taskA(),
taskB()
];
console.log(text1, text2);
}
iterator 인터페이스 배치하기
function* iterEntries(obj) {
let keys = Object.keys(obj);
for (let i=0; i < keys.length; i++) {
let key = keys[i];
yield [key, obj[key]];
}
}
let myObj = { foo: 3, bar: 7 };
for (let [key, value] of iterEntries(myObj)) {
console.log(key, value);
}
// foo 3
// bar 7
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.